1. 程式人生 > >領釦(LeetCode)檢測大寫字母

領釦(LeetCode)檢測大寫字母

給定一個單詞,你需要判斷單詞的大寫使用是否正確。

我們定義,在以下情況時,單詞的大寫用法是正確的:

  1. 全部字母都是大寫,比如"USA"。
  2. 單詞中所有字母都不是大寫,比如"leetcode"。
  3. 如果單詞不只含有一個字母,只有首字母大寫, 比如 "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 };