500.键盘行 693.交替位二进制数(java实现)

键盘行

题目:给定一个单词列表,只返回可以使用在键盘同一行的字母打印出来的单词。键盘如下图所示。

示例1:

输入: ["Hello", "Alaska", "Dad", "Peace"]
输出: ["Alaska", "Dad"]

注意:

  1. 你可以重复使用键盘上同一字符。

  2. 你可以假设输入的字符串将只包含字母。

这个题目比较简单,只要将每个字母对应的行数用键值对的形式存起来,然后遍历字符串中每个字母是否和第一个字母在同一行,不在同一行则跳出循环,该字符串不符合条件。代码如下:

        HashMap<Character, Integer> map = new HashMap<>();
        map.put('q', 0);
        map.put('w', 0);
        map.put('e', 0);
        map.put('r', 0);
        map.put('t', 0);
        map.put('y', 0);
        map.put('u', 0);
        map.put('i', 0);
        map.put('o', 0);
        map.put('p', 0);

        map.put('a', 1);
        map.put('s', 1);
        map.put('d', 1);
        map.put('f', 1);
        map.put('g', 1);
        map.put('h', 1);
        map.put('j', 1);
        map.put('k', 1);
        map.put('l', 1);

        map.put('z', 2);
        map.put('x', 2);
        map.put('c', 2);
        map.put('v', 2);
        map.put('b', 2);
        map.put('n', 2);
        map.put('m', 2);

        List<String> res = new ArrayList<>();
        for (int i = 0; i < words.length; i++) {
            String s = words[i].toLowerCase();
            int first = map.get(s.charAt(0));
            boolean diff = false;
            for (int j = 1; j < s.length(); j++) {
                if (map.get(s.charAt(j)) != first) {
                    diff = true;
                    break;
                }
            }
            if (!diff) {
                res.add(words[i]);
            }
        }
        String[] resString = new String[res.size()];
        for (int i = 0; i < resString.length; i++) {
            resString[i] = res.get(i);
        }

        return resString;

需要注意的是,字符串中的字母有可能大小不一样,需要统一后进行判断。

693.交替位二进制数

给定一个正整数,检查他是否为交替位二进制数:换句话说,就是他的二进制数相邻的两个位数永不相等。

示例 1:

输入: 5
输出: True
解释:
5的二进制数是: 101

示例 2:

输入: 7
输出: False
解释:
7的二进制数是: 111

示例 3:

输入: 11
输出: False
解释:
11的二进制数是: 1011

 示例 4:

输入: 10
输出: True
解释:
10的二进制数是: 1010

这题是关于位操作的一个题目,我们可以发现5的二进制数101往右移一位后再跟5做加法或者异或运算都是得到相同的结果011,所以第一步做相加还是异或都可以,可以发现只要是交替位二进制数第一步得到的结果都是类似这样的11......1111,所有位置上都是1,我们只要判断第一步运算后的结果的二进制所有位是否为1就行了,要判断这个,只要将第一步结果11再加上1得到100,然后再和11进行按位与操作得到0,即可判断这个数就是交替位二进制数,代码如下:

    public boolean hasAlternatingBits(int n) {
        return ((n + (n >> 1) ) & (n + (n >> 1)+1)) == 0;
    }

就一行简单的代码就可以了。

猜你喜欢

转载自blog.csdn.net/luqiren/article/details/82626480