Length of Last Word
1 class Solution { 2 public: 3 int lengthOfLastWord(const char *s) { 4 int length=0; 5 int i=0; 6 int n=0;//存储遇到空格之前的word的长度 7 if(s!=NULL) 8 { 9 10 while(s[i]!='\0') 11 { 12 while(s[i]!=' ') 13 { 14 n++; 15 i++; 16 } 17 length=n; 18 n==0; 19 } 20 } 21 return length; 22 } 23 };
不止超时,程序也不对,我本来想着是用一个变量n记录上一个word的长度,然后把n赋给length,然后遇到空格就把n清零
其实即使这样也不对,因为如果最后那个没有空格,那就返回的是倒数第二个word的值了。
C++中有函数可以去除首尾空格,并将字符串按一定格式分割。
刚才和实验室的同学讨论,他说可以从后向前,对呀,这个想法太好了,呵呵
PS:又谈到几个题,数组中的数都是重复2次出现,只有一个是出现了一次,怎么找出那个数,
我说可以先排序,然后设置两个指针就行了,时间复杂度O(nlgn)
他说时间复杂度和空间复杂度都是O(1)的,所有数据异或操作就行了,异或操作可以交换次序的,也不用事先排序了。
可以扩展为所有出现2次,只有2个出现1次,还有所有出现3次,只有一个出现一次等等,当然解法不同了。
又说道另外一个题,怎么判断一个链表是否有环。记录所有扫描的指针,扫描下一个时查看是否之前扫描过,这种方法显然不行的。
他说可以设置两个指针,快的在前,慢的在后,当快的跑到慢的后面的时候说明有环。
好了,言归正传
1 class Solution { 2 public: 3 int lengthOfLastWord(const char *s) { 4 int length=0; 5 if(s!=NULL) 6 { 7 const char *p; 8 p=s; 9 while(*s!='\0') 10 { 11 s++; 12 } 13 s--; 14 /* 15 while(*s!=' ') 16 { 17 length++; 18 s--; 19 }//这样写,错误,eg:"a",根本就没有空格,说明循环判断的条件不对 20 */ 21 while((*s!=' ')&&(s>=p))//因为s--了,所以不能是s==p来判断 22 { 23 length++; 24 s--; 25 } 26 } 27 return length; 28 } 29 };
Status:
Wrong Answer
Input: | "a " |
Output: | 0 |
Expected: | 1 |
我在codeblocks中试了,是可以的,不知道为什么在leetcode上没有通过。
网上查找了一下,发现其实还是想的不周到,既然从后向前,那么后边的空格应该先去掉的,若输入"a "那么我写的结果就会是错的。
需要在上面代码21行之前加上下面几句话就AC了
while(*s==' ') { s--; }
posted on 2014-03-06 19:31 crane_practice 阅读(219) 评论(0) 编辑 收藏 举报