给定一个正整数n,找到小于或等于n的非负整数,其二进制表示不包含连续的整数。
2017-12-10 10:46
423 查看
本题源自leetcode 600 https://leetcode.com/problems/non-negative-integers-without-consecutive-ones/discuss/
=----------------------------------------------------------------------
思路: 动态规划 用斐波那契数列
代码:
int findIntegers(int num) {
vector<int> dp(32,0);
dp[0] = 1;
dp[1] = 2;
for(int i = 2; i < 32;i++){
dp[i] = dp[i - 1] + dp[i - 2];
}
int res = 0;
int pre_bit = 0;
int k = 30;
while(k >= 0){
if(num & (1 << k)){
res += dp[k];
if(pre_bit)
return res;
pre_bit = 1;
}
else
pre_bit = 0;
k--;
}
return res + 1;
}
=----------------------------------------------------------------------
思路: 动态规划 用斐波那契数列
代码:
int findIntegers(int num) {
vector<int> dp(32,0);
dp[0] = 1;
dp[1] = 2;
for(int i = 2; i < 32;i++){
dp[i] = dp[i - 1] + dp[i - 2];
}
int res = 0;
int pre_bit = 0;
int k = 30;
while(k >= 0){
if(num & (1 << k)){
res += dp[k];
if(pre_bit)
return res;
pre_bit = 1;
}
else
pre_bit = 0;
k--;
}
return res + 1;
}
相关文章推荐
- 有一个直方图,用一个整数数组表示,其中每列的宽度为1,求所给直方图包含的最大矩形面积。比如,对于直方图[2,7,9,4],它所包含的最大矩形的面积为14(即[7,9]包涵的7x2的矩形)。给定一个直方图A及它的总宽度n,请返回最大矩形面积。保证直方图宽度小于等于500。保证结果在int范围内。
- 给定一个正整数x,找到一个最小的正整数y,使得y的每一位相乘,最后值等于x
- LeetCode试题之““给定一个正整数A,找到最小的正整数B,它的每一个数字的乘法等于A。””
- 扩展性与存储限制(二)——给定一个输入文件,包含40亿个非负整数。产生一个不在该文件中的整数。内存限制:1GB
- 一个正整数有可能可以被表示为 m(m>=2) 个连续正整数之和,编写一个程序,输入一个正整数,然后找出符合这种要求的所有 连续正整数序列,若不存在这种序列,则打印None。
- 一个正整数有可能可以表示为n(n>=2)个连续的正整数之和,如:15=1+2+3+4+5,15=4+5+6,15=7+8 请编写程序,根据输入的任何一个正整数,找出符合这种要求的所有连续正整数序列。
- 谷歌笔试题--给定一个集合A=[0,1,3,8](该集合中的元素都是在0,9之间的数字,但未必全部包含), 指定任意一个正整数K,请用A中的元素组成一个大于K的最小正整数。
- 程序员面试金典--面试27之有一个正整数,请找出其二进制表示中1的个数相同、且大小最接近的那两个数
- 任意给定一个正整数N,求一个最小的正整数M(M>1),使得N*M的十进制表示形式里只含有1和0。
- 如何判断一个整数x是否可以表示成n个连续正整数的和
- 9.10扩展性与存储限制(二)——给定一个输入文件,包含40亿个非负整数。产生一个不在该文件中的整数。内存限制:1GB
- 输入一个整数,求该整数的二进制表达中有多少个1。例如输入10,由于其二进制表示为1010,有两个1,因此输出2。
- 给定两个用链表表示的整数,每个结点包含一个数位。这些数位是反向存放的,也就是个位排在链表首部
- 输入一个正整数,若该数能用几个连续正整数之和表示,则输出所有可能的正整数序列。
- 9.2链表(五)——给定两个用链表表示的整数,每个结点包含一个数位。这些数位是反向存放的,也就是个位排在链表首部
- 任意给定一个正整数N,求一个最小的正整数M(M>1),使得N*M的十进制表示形式里只含有1和0。
- 输入一个整数,求该整数的二进制表达中有多少个1。例如输入10,由于其二进制表示为1010,有两个1,因此输出2。
- 给定一个正整数,编写程序计算有多少对质数的和等于输入的这个正整数,并输出结果。输入值小于1000。
- 对于一个字符串,请设计一个高效算法,找到第一次重复出现的字符。 给定一个字符串(不一定全为字母)A及它的长度n。请返回第一个重复出现的字符。保证字符串中有重复字符,字符串的长度小于等于500。
- 给定一个字符串类型表示的小数,输出其二进制表示