键盘行
题目:给定一个单词列表,只返回可以使用在键盘同一行的字母打印出来的单词。键盘如下图所示。
示例1:
输入: ["Hello", "Alaska", "Dad", "Peace"]
输出: ["Alaska", "Dad"]
注意:
-
你可以重复使用键盘上同一字符。
-
你可以假设输入的字符串将只包含字母。
这个题目比较简单,只要将每个字母对应的行数用键值对的形式存起来,然后遍历字符串中每个字母是否和第一个字母在同一行,不在同一行则跳出循环,该字符串不符合条件。代码如下:
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;
}
就一行简单的代码就可以了。