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)
      • 这样,移动到最后的’\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;
}

You may also like...

发表评论

邮箱地址不会被公开。 必填项已用*标注