题目地址:https://leetcode.com/problems/detect-capital/#/descriptionopen in new window

题目描述

Given a word, you need to judge whether the usage of capitals in it is right or not.

Wedefine the usage of capitals in a word to be right when one of the following cases holds:

1、 Alllettersinthiswordarecapitals,like"USA".;
2、 Alllettersinthiswordarenotcapitals,like"leetcode".;
3、 Onlythefirstletterinthiswordiscapitalifithasmorethanoneletter,like"Google".;

Otherwise, we define that this word doesn't use capitals in a right way.

Example :

Input: "USA"
Output: True

Input: "FlaG"
Output: False

题目大意

判断一个字符串是否满足大写规则:全部大写,开头大写后面小写,全部小写。

解题方法

循环判断三个条件

往往简单的方法就最有效。这个题说了有三种情况,那我就判断三种情况,如果有一个情况满足就可以。在判断是否满足全大写的时候,如果有一个字母是小写,那么就判断为false,然后break;就好了。就这样判断了三次,最后如果有一个是true,即可返回是。

这样的一个缺点就是如果已经判断是全大写,还要判断其他的,当然可以写if语句判断,但是我感觉有点啰嗦,还不如直接三个情况都判断简单。

public class Solution {
    public boolean detectCapitalUse(String word) {
        if(word == null || word.length() == 0){
            return false;
        }
        int len = word.length();
        boolean isUpper = true;//全大写
        boolean isLower = true;//全小写
        boolean isFirst = true;//首字母大写
        for(int i = 0; i < len; i++){
            if(word.charAt(i) >= 'a' && word.charAt(i) <= 'z'){
                isUpper = false;
                break;
            }
        }
        for(int i =0; i < len; i++){
            if(word.charAt(i) >= 'A' && word.charAt(i) <= 'Z'){
                isLower = false;
                break;
            }
        }
        if(word.charAt(0) >= 'a' && word.charAt(0) <= 'z'){
            isFirst = false;
        }
        for(int i = 1; i < len; i++){
            if(word.charAt(i) >= 'A' && word.charAt(i) <= 'Z'){
                isFirst = false;
                break;
            }
        }
        return isLower || isUpper || isFirst;
    }
}

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33

大写字母个数和位置判断

看到了别人的更简洁的做法,统计大写字母的个数,有0个或者全是大写,或者只有一个大写并且在首位。

Java版本:

public class Solution {
    public boolean detectCapitalUse(String word) {
        int cnt = 0;
        for(char c: word.toCharArray()) if('Z' - c >= 0) cnt++;
        return ((cnt==0 || cnt==word.length()) || (cnt==1 && 'Z' - word.charAt(0)>=0));
    }
}

1 2 3 4 5 6 7

python版本:

class Solution(object):
    def detectCapitalUse(self, word):
        """
        :type word: str
        :rtype: bool
        """
        count = 0
        for i, w in enumerate(word):
            if w.isupper():
                count += 1
        return count == len(word) or count == 0 or (word[0].isupper() and count == 1)

1 2 3 4 5 6 7 8 9 10 11

根据首字符判断

如果首字符是大写,那么后面可以全部小写或者全部小写。 如果首字符是小写,那么后面只能全部小写。

python版本:

class Solution(object):
    def detectCapitalUse(self, word):
        """
        :type word: str
        :rtype: bool
        """
        if word[0].isupper():
            return all(map(lambda w : w.isupper(), word[1:])) or all(map(lambda w : w.islower(), word[1:]))
        else:
            return all(map(lambda w : w.islower(), word[1:]))

1 2 3 4 5 6 7 8 9 10

DDKK.COM 弟弟快看-教程,程序员编程资料站,版权归原作者所有

本文经作者:负雪明烛 授权发布,任何组织或个人未经作者授权不得转发