二进制间距
https://leetcode.cn/problems/binary-gap/
题目
给定一个正整数 n,找到并返回 n 的二进制表示中两个 相邻 1 之间的 最长距离 。如果不存在两个相邻的 1,返回 0 。
如果只有 0 将两个 1 分隔开(可能不存在 0 ),则认为这两个 1 彼此 相邻 。两个 1 之间的距离是它们的二进制表示中位置的绝对差。例如,“1001” 中的两个 1 的距离为 3 。
- 示例 1:
输入:n = 22
输出:2
解释:
22 的二进制是 “10110” 。
在 22 的二进制表示中,有三个 1,组成两对相邻的 1 。
第一对相邻的 1 中,两个 1 之间的距离为 2 。
第二对相邻的 1 中,两个 1 之间的距离为 1 。
答案取两个距离之中最大的,也就是 2 。
思路
首先将其转化为2进制,然后通过两层循环,通过flag来防止越界,然后将距离存入数组中,获取最大值即可。
代码
import java.util.*;
class Solution {
public int binaryGap(int n) {
List<Integer> binary = new ArrayList<Integer>();
while (n != 0) {
binary.add(n % 2);
n /= 2;
}
Collections.reverse(binary);
List<Integer> list = new ArrayList<>();
boolean flag = true;
for (int i = 0; i < binary.size(); i++) {
if (binary.get(i) == 1) {
int left = i;
flag = true;
for (int j = i + 1; j < binary.size() && flag == true; j++) {
if (binary.get(j) == 1) {
int right = j;
list.add(right - left);
flag = false;
}
}
}
}
Collections.sort(list);if (list.size() == 0) {
return 0;
} else {
return list.get(list.size() - 1);
}
}
}
位1的个数
题目
编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量)。
- 示例 1:
输入:00000000000000000000000000001011
输出:3
解释:
输入的二进制串 00000000000000000000000000001011 中,共有三位为 ‘1’。
思路
for循环遍历,遇到‘1’则res自增1
代码
class Solution {
// you need to treat n as an unsigned value
public int hammingWeight(int n) {
int ret = 0;
for (int i = 0; i < 32; i++) {
if ((n & (1 << i)) != 0) {
ret++;
}
}
return ret;
}
}
只出现一次的数字
题目
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
- 示例 1:
输入: [2,2,1]
输出: 1
思路
用map存储数字和出现次数,查询count为1的数
代码
class Solution2 {
public int singleNumber(int[] nums) {
Map<Integer, Integer> map = new HashMap<>();
for (Integer i : nums) {
Integer count = map.get(i);
count = count == null ? 1 : ++count;
map.put(i, count);
}
for (Integer i : map.keySet()) {
Integer count = map.get(i);
if (count == 1) {
return i;
}
}
return -1; // can't find it.
}
}