NC120 二进制中1的个数
描述
输入一个整数 n ,输出该数32位二进制表示中1的个数。其中负数用补码表示。
示例1
输入:
1 | 10 |
返回值:
1 | 2 |
说明:
1 | 十进制中10的32位二进制表示为0000 0000 0000 0000 0000 0000 0000 1010,其中有两个1。 |
示例2
输入:
1 | -1 |
返回值:
1 | 32 |
说明:
1 | 负数使用补码表示 ,-1的32位二进制表示为1111 1111 1111 1111 1111 1111 1111 1111,其中32个1 |
思路:
- 计算机中存储数据都是补码的形式
- 正数的反码和补码是它本身
- 负数的反码是除符号位外的相反数,补码是反码加一
- 补码为反码+1
- 负数在计算机中存储形式为补码
- 负数右移符号位补1
- 采用与位左移代替数字右移
解答:
1 | public class Solution { |
NC107 寻找峰值
描述
给定一个长度为n的数组nums,请你找到峰值并返回其索引。数组可能包含多个峰值,在这种情况下,返回任何一个所在位置即可。
1.峰值元素是指其值严格大于左右相邻值的元素。严格大于即不能有等于
2.假设 nums[-1] = nums[n] = -\infty−∞
3.对于所有有效的 i 都有 nums[i] != nums[i + 1]
4.你可以使用O(logN)的时间复杂度实现此问题吗?
数据范围:
1 \le nums.length \le 2\times 10^5 \1≤num**s.lengt**h≤2×105
-2^{31}<= nums[i] <= 2^{31} - 1−231<=num**s[i]<=231−1
如输入[2,4,1,2,7,8,4]时,会形成两个山峰,一个是索引为1,峰值为4的山峰,另一个是索引为5,峰值为8的山峰,如下图所示:
示例1
输入:
1 | [2,4,1,2,7,8,4] |
返回值:
1 | 1 |
说明:
1 | 4和8都是峰值元素,返回4的索引1或者8的索引5都可以 |
示例2
输入:
1 | [1,2,3,1] |
返回值:
1 | 2 |
说明:
1 | 3 是峰值元素,返回其索引 2 |
思路:
- 注意第一位和最后一位
- 当前位比前一位小就说明前一位为峰值
解答:
1 | import java.util.*; |