【Lintcode】1820. Find Letter

题目地址:

https://www.lintcode.com/problem/find-letter/description

给定一个字符串,返回其出现过的同时出现小写和大写字母的那些字母中,最大的字母的大写。例如,对于 a A b B c D aAbBcD aAbBcD这个字符串, a a a b b b都出现了小写和大写,且 b > a b>a b>a,所以返回 b b b的大写也就是 B B B。如果不存在这样的字母则返回~。因为字母总共是 26 26 26个,所以我们可以用两个 32 32 32位整数的二进制位来分别表示某个字母的小写和大写是否出现过。最后只需要求这两个整数的与,再求出最高位的 1 1 1即可。代码如下:

public class Solution {
     
    /**
     * @param str: the str
     * @return: the letter
     */
    public char findLetter(String str) {
     
        // Write your code here.
        // 如果str为空则直接返回'~'
        if (str == null || str.isEmpty()) {
     
            return '~';
        }
    
        int lower = 0, upper = 0;
        for (int i = 0; i < str.length(); i++) {
     
            if (Character.isLowerCase(str.charAt(i))) {
     
                lower |= 1 << (str.charAt(i) - 'a');
            } else if (Character.isUpperCase(str.charAt(i))) {
     
                upper |= 1 << (str.charAt(i) - 'A');
            }
        }
        // 如果与起来是0,说明不存在那样的字母,返回'~'
        if ((lower & upper) == 0) {
     
            return '~';
        }
        
        // 接下来求一下最高位的1在哪儿
        int and = lower & upper;
        int count = 0;
        while (and != 1) {
     
            count++;
            and >>= 1;
        }
        
        return (char) ('A' + count);
    }
}

时间复杂度 O ( n ) O(n) O(n),空间 O ( 1 ) O(1) O(1)

你可能感兴趣的:(#,二分,位运算与数学,字符串,算法)