Coderbyte-Challenger之Letter Capitalize(单词字母大写)

如题:

Have the function LetterCapitalize(str) take the str parameter being passed and capitalize the first letter of each word. Words will be separated by only one space. 

翻译过来大体意思就是将字符串中每个单词的首字母改成大写。

Test Data:

Case 1:

input:"hello world"

output:"Hello World"

Case 2:

input:"welcome to coderbyte!"

output:"Welcome To Coderbyte!"

这里我们我们将从多个编程语言角度来看一下如何使我们的代码更加的优化。

使用js编写此题时有大概如下几种思路:

1、首先能够想到的就是将每个单词先分割出来,然后将分割出来的每个单词的首字母变成大写,然后再拼凑再一块,按照这种直接的思路就写下了version1:

function LetterCapitalize(str) { 
  var arr=str.split(" ");
  var n=arr.length;
  for (var i=0;i<n;i++)
  {
    arr[i]=arr[i].split("");
    arr[i][0]= arr[i][0].toUpperCase();
    arr[i]=arr[i].join("");
  }
  return arr.join(" ");       
}

2、通过再次分析,感觉这样先分割在拼凑的效率实在太低,仅仅只是为了改变一个单词的首字母,有种杀鸡用牛刀的感觉。换了一下思维,我们是否可以定位一个

blank呢,这样的话每次在遇到blank之后的第一个字符不就是首字母吗(第一个单词除外),按照这种思路写下了version2:

需要声明的一点就是为了弥补字符串第一个单词没有blank分隔,在第一次需要手动进行设置即 var last=' ',这样我们把整个字符数组遍历了一遍然后最后返回改变后的字符串。

3、但是看起来代码还是略显麻烦,而且每次字符串的+操作效率也很低,有没有比较好的查询替代方法呢?通过网上查资料,发现js的replace支持正则表达式,按照这种思路并参考牛人讲解写下了version3:

function LetterCapitalize(str) { 
  return str.replace(/(^|\s)[a-z]/gi, function (m) {
    return m.toUpperCase();
  }); 
         
}

或是

function LetterCapitalize(str){   
	str = str.toLowerCase();   
	return str.replace(/\b(\w)|\s(\w)/g, function(m){
		return m.toUpperCase();
	});  
}

这里不再过多提正则表达式的格式。这样短短两三行的代码就把我们之前的冗余代码给否定了,感觉世界瞬间美妙了许多。

使用C++编写此题同样也是上述思路1和2的结合:

string LetterCapitalize(string str) { 

  // code goes here
  if(str[0] > 96 && str[0] < 123)
    str[0] = str[0] - 32;
  
  for(int i=1; i<str.size(); i++){
    if(str[i-1] == ' '){
      if(str[i] > 96 && str[i] < 123)
        str[i] = (int)str[i]-32;
    }
  }
  return str; 
            
}

这里我们总结了思路1和2,其实我们不必刻意去设置一个mark来表明是空格,我们 完全可以在进行字符数组遍历的过程中遇到blank时对之后的字符进行大写替换,因为我们使用的字符数组已经知道每个字符的索引,何必再可以设置标记呢。

使用pyhon编写此题会更加的方便:

def LetterCapitalize(s):
    return (' ').join([x.capitalize() for x in s.split()])

区区两行代码显示出来的功能是如此的强大,这里用到的核心思想就是python中的列表解析

(可参考http://docs.python.org/2/tutorial/datastructures.html#list-comprehensions

写这篇文章的目的不在于评价哪种语言的好坏,而是说我们在编码过程中选择合适的编程语言以及一些工具能够使你事半功倍。

本人也是码农级别的菜鸟,讲学习过程中的一些好的思路和方法与共同分享一下。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏C语言及其他语言

C语言自定义函数如何返回数组(上)?

最近看到一些同学问题,有提到说:如何在一个函数中返回数组呢? 能否直接在自定义 函数中,写成char *类型返回值,直接返回呢?,代码如下: ? 直接返回str...

53640
来自专栏前端架构与工程

【翻译】ES6生成器简介

原文地址:http://davidwalsh.name/es6-generators ES6生成器全部文章: The Basics Of ES6 Generat...

21070
来自专栏智能算法

Python学习(一)---- Python基础必备

https://blog.csdn.net/fgf00/article/details/52061971

57040
来自专栏技术之路

c++基础 使用智能指针

三个智能指针模板(auto_ptr、unique_ptr和shard_ptr)都定义了类似指针的对象(c++11已将auto_ptr摒弃),可以将new获得(直...

20750
来自专栏代码世界

Python之面向对象四

面向对象进阶 一、关于面向对象的两个内置函数 isinstance   判断类与对象的关系    isinstance(obj,cls)检查obj是否是类 cl...

394130
来自专栏orientlu

C 链表 - linux 如何实现

链表是基本数据结构, 一开始学习数据结构时, 我一般这么定义, 对应实现从头或尾插入的处理函数,

20430
来自专栏程序猿

Linux sed 命令的使用

首先,就昨晚的发的消息道歉,虽然整蛊大家了,但是我还是挺开心的。 sed是一种流编辑器,配合正则表达式使用,sed处理文件之时,把当前处理的文保存...

404100
来自专栏C语言及其他语言

C语言第一个简单实例

在信息化、智能化的世界里,可能很早很早 我们就听过许多IT类的名词,C语言也在其中,我们侃侃而谈,到底C程序是什么样子?让我们先看简单的一个例子: #inclu...

36460
来自专栏编程

Python原创0基础入门一看几张图就学会了

Python最近势头很猛,由于他在人工智能方面的出色表现,已经成为现在热门的编程语音之一,为了大家方便学习,而不是浪费时间去看入门教程,萌掌用图片的方式画出了你...

23380
来自专栏Java技术栈

10 道关于 Java 泛型的面试题

这是在各种Java泛型面试中,一开场你就会被问到的问题中的一个,主要集中在初级和中级面试中。那些拥有Java1.4或更早版本的开发背景的人都知道,在集合中存储对...

12420

扫码关注云+社区

领取腾讯云代金券