领扣(LeetCode)检测大写字母 个人题解
给定一个单词,你需要判断单词的大写使用是否正确。
我们定义,在以下情况时,单词的大写用法是正确的:
- 全部字母都是大写,比如"USA"。
- 单词中所有字母都不是大写,比如"leetcode"。
- 如果单词不只含有一个字母,只有首字母大写, 比如 "Google"。
否则,我们定义这个单词没有正确使用大写字母。
示例 1:
输入: "USA" 输出: True
示例 2:
输入: "FlaG" 输出: False
注意: 输入是由大写和小写拉丁字母组成的非空单词。
这题比较简单。第一个想法是做三个判断。一个判断是不是全部小写,一个判断是不是全部大写,一个判断是不是首字符大写,其他字符小写。
代码如下:
1 class Solution { 2 public boolean detectCapitalUse(String word) { 3 if (word.equals(word.toLowerCase()) || word.equals(word.toUpperCase())) 4 return true; 5 else if ('A' <= word.charAt(0) && word.charAt(0) <= 'Z') { 6 String tmp = word.substring(1); 7 if (tmp.equals(tmp.toLowerCase())) 8 return true; 9 else 10 return false; 11 } 12 return false; 13 } 14 }
但是这样写,算法的执行速度很慢,只打败了10%的玩家 XD 。因为对这个字符串内的字符进行了多次遍历。然后就在想,为什么不用一次遍历解决呢?因为全部大写,全部小写,首字符大写三个情况可以在一个遍历中判断。首先置三种情况的结果都为真,然后一旦遇到不符合其中任意一种情况的时候,将那种情况置为假,最后输出三种结果或的结果。这样的执行速度就非常快了。打败了86%的人。
代码如下:
1 class Solution { 2 public boolean detectCapitalUse(String word) { 3 boolean case1=true,case2=true,case3=true; 4 for(int i=0;i<word.length();i++) 5 { 6 if('A'<=word.charAt(i) && word.charAt(i)<= 'Z') 7 { 8 case2=false; 9 if(i>=1) 10 case3=false; 11 } 12 if('a'<=word.charAt(i) && word.charAt(i)<= 'z') 13 { 14 case1=false; 15 if(i==0) 16 case3=false; 17 } 18 } 19 return case1 || case2 || case3; 20 } 21 }
最后呢,题外话,想看一下C++和JAVA执行速度的区别,于是用C++改写了代码,结果发现,执行速度降低了20ms,这次打败了91%的人。C++果然天下第一啊
代码如下:
1 class Solution { 2 public: 3 bool detectCapitalUse(string word) { 4 bool case1=true,case2=true,case3=true; 5 for(int i=0;i<word.length();i++) 6 { 7 if('A'<=word[i] && word[i]<= 'Z') 8 { 9 case2=false; 10 if(i>=1) 11 case3=false; 12 } 13 if('a'<=word[i] && word[i]<= 'z') 14 { 15 case1=false; 16 if(i==0) 17 case3=false; 18 } 19 } 20 return case1 || case2 || case3; 21 } 22 };