三种情况是正确的:
- 全是大写
- 全是小写
- 第一个是大写,其他是小写
思路就是:
- 先判断特殊情况,如果是只有一位或没有位数,则返回正确。
- 判断是否是大小写,可通过ascii码表来看,整数65~90代表大写。
- 再判断第一个情况,如果第一个为大写,则后面全大写或全小写都行。
- 如果第一个为小写,则后面只能小写。
- 然后遍历,标志位分别加1
- 遍历完判断是否满足以上三种符合的情况
代码:
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;