leetcode520:检测大写字母

三种情况是正确的:

  1. 全是大写
  2. 全是小写
  3. 第一个是大写,其他是小写

思路就是:

  1. 先判断特殊情况,如果是只有一位或没有位数,则返回正确。
  2. 判断是否是大小写,可通过ascii码表来看,整数65~90代表大写。
  3. 再判断第一个情况,如果第一个为大写,则后面全大写或全小写都行。
  4. 如果第一个为小写,则后面只能小写。
  5. 然后遍历,标志位分别加1
  6. 遍历完判断是否满足以上三种符合的情况

代码:

bool detectCapitalUse(string word) {
    int da = 0,xiao = 0,flag = 0;
    if(word.size() == 1 || word.size() == 0)
        return true;
    if(word.size() > 1) {
        //如果首字母是小于号,那么后面的数都要是小的
        if (word[0] < 65 || word[0] > 90)
            flag = 1;
        //如果首字母是大于号,那么后面要么全部小,要么全部大
        else flag = 0;
    }
    //从第二个数开始算
    for(int i = 1; i < word.size(); i ++)
    {
        if(word[i] < 65 || word[i] > 90)
        {
            xiao ++;
        }
        else
        {
            da ++ ;
        }
    }
    if(word.size() - 1 == xiao )
        return true;
    else if(da == word.size() - 1 && flag !=1)
        return true;
    else return false;
}

当然,你也可以写的更简单,省略掉da变量。


bool detectCapitalUse(string word) {
    int xiao = 0,flag = 0;
    if(word.size() == 1 || word.size() == 0)
        return true;
    if(word.size() > 1) {
        //如果首字母是小于号,那么后面的数都要是小的
        if (word[0] < 65 || word[0] > 90)
            flag = 1;
        //如果首字母是大于号,那么后面要么全部小,要么全部大
    }
    //从第二个数开始算
    for(int i = 1; i < word.size(); i ++)
    {
        if(word[i] < 65 || word[i] > 90)
        {
            xiao ++;
        }
    }
    if(word.size() - 1 == xiao || (xiao == 0 && flag !=1) )
        return true;
    else return false;
}

还可以再把最后三句话优雅写一点,用个三目运算法。

return (word.size() - 1 == xiao || (xiao == 0 && flag !=1)) ? true: false;
发布了42 篇原创文章 · 获赞 50 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/Hanghang_/article/details/104889011