LeetCode-简单-58-最后一个单词的长度-不定义变量计算小于127位单词长度(C)
本来只是想找题简单的划水一下,结果这题太简单了...不好意思划水...
于是想不定义变量来解决这题,结果还是没划水成功...
题目
给定一个仅包含大小写字母和空格 ' ' 的字符串 s,返回其最后一个单词的长度。如果字符串从左向右滚动显示,那么最后一个单词就是最后出现的单词。
如果不存在最后一个单词,请返回 0 。
说明:一个单词是指仅由字母组成、不包含任何空格字符的 最大子字符串。
示例:
输入: "Hello World"
输出: 5
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/length-of-last-word
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
- 这题解法极其简单,所以想了点骚操作。
- 不定义变量来解决这题:
- 结果是通过了56/58个测试案例,因为C的char型只有128位,再加上两个用来表示空格的字符,所以最后一个单词如果大于126位就会出错。
- 思路:
- 先把空字符串排除。
- 再区分两种,一种是全是空格的,另一种是非全空格的。
- 为了区分这两种,如果第一个是空格,将其ascii码置为0,
- 向后移动指针,每次将其与前一个字符比对:
- 如果前字符的ascii码为0:
- 说明前面都是空格。
- 如果该字符为空格,置0
- 如果该字符非空格,置2
- 如果前字符的ascii码为1:
- 说明前面至少出现过一次非空格。
- 如果该字符为空格,置1
- 如果该字符非空格,置2
- 如果前字符的ascii码非1非0:
- 说明前面的字符不是空格。
- 如果该字符为空格:置1
- 如果该空格非空格:将其置为(前一个值的ascii码+1)
- 如果前字符的ascii码为0:
- 这样,移动到最后的'\0'时,再向前移动指针:
- 如果该字符是0,说明前面全是空格,这个是空格串。
- 如果该字符是1,说明前面至少出现了一个单词,继续向前移动。
- 如果该字符非1非0,则找到了最后一个单词的尾字母:
- 因为每个单词的首字母的ascii码都是2,因此直接将该字符的ascii-2即可得到长度。
- 限制也是在这里,ascii码只有128位,如果超过会循环,因此如果单只是递增的设置单词字符,最多也不会超过128个字母。
- 如果想计算更多的字母,要想个算法来改变字符的ascii码。
- 下面两张图是执行结果。
代码
- 常规解法:
int lengthOfLastWord(char * s){
int length=0;
char *pos=s;
while(*pos!='\0' && pos++ && *pos!='\0');
while(pos!=s && --pos && *pos==' ');
if(*pos!='\0') pos++;
while(pos!=s && --pos && *pos!=' ') length++;
return length;
}
- 不定义变量解题(仅能计算126位以下单词长度):
int lengthOfLastWord(char * s){
if(*s=='\0') return 0;
if(*s==' ') *s = 0;
else *s = 2;
while(*(++s)!='\0'){
if(*s==' ')
if(*(s-1)==0) *s=0;
else *s=1;
else
if(*(s-1)==1 || *(s-1)==0) *s=2;
else *s=*(s-1)+1;
}
if(s){
if(*(s-1)==0) return 0;
else{
while(*--s==1);
return *s-2+1;
}
}
return 0;
}
共有 0 条评论