三種情況是正確的:
- 全是大寫
- 全是小寫
- 第一個是大寫,其他是小寫
思路就是:
- 先判斷特殊情況,如果是隻有一位或沒有位數,則返回正確。
- 判斷是否是大小寫,可通過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;