如题:
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:
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)
写这篇文章的目的不在于评价哪种语言的好坏,而是说我们在编码过程中选择合适的编程语言以及一些工具能够使你事半功倍。
本人也是码农级别的菜鸟,讲学习过程中的一些好的思路和方法与共同分享一下。