专栏首页开发 & 算法杂谈Coderbyte-Challenger之Letter Capitalize(单词字母大写)

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 条评论
登录 后参与评论

相关文章

  • 凸包问题之蛮力解法

    1  点集Q的凸包(convex hull)是指一个最小凸多边形,满足Q中的点或者在多边形边上或者在其内。下图中由红色线段表示的多边形就是点集Q={p0,p1...

    chain
  • Hiredis源码阅读(二)

    上一篇介绍了Hiredis中的同步api以及回复解析api,这里紧接着介绍异步api。异步api需要与事件库(libevent、libev、ae一起工作)。

    chain
  • PAT Basic 1005

    chain
  • js去掉字符串前后空格的五种方法

    第一种:循环检查替换 [javascript] //供使用者调用   function trim(s){   return trimRight(trimLeft...

    joshua317
  • PHP对Json字符串解码返回NULL的一般解决方案

    php对json字符串解码使用json_decode()函数,第一个参数传字符串,第二个参数若为true,返回array;若为false,返回object。如果...

    用户7657330
  • HDU - 2024 C语言合法标识符

    C语言标识符是指用来标识某个实体的一个符号,在不同的应用环境下有不同的含义,标识符由字母(A-Z,a-z)、数字(0-9)、下划线“_”组成,并且首字符不能是数...

    种花家的奋斗兔
  • python str转bool方法

    py3study
  • 【Codeforces】1230B - Ania and Minimizing

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    喜欢ctrl的cxk
  • R&Python Data Science系列:数据处理(5)--字符串函数基于R(一)

    数据根据结构可以分为结构化数据、非结构化数据和半结构化数据,前面介绍的数据处理函数针对于结构化数据,而字符串通常包含非结构化或者半结构化数据,这一部分介绍一下...

    1480
  • xss防御

    XSS攻击:跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故...

    听城

扫码关注云+社区

领取腾讯云代金券