笔试算法题(14):整数二进制表示中的1 & 判定栈的push和pop序列是否对应
2014-05-20 10:33
274 查看
出题:输入一个整数,要求计算此整数的二进制表示中1的个数
分析:
如果整数表示为k,当其是负数的时候,使用1<<i分别检测k的每一位;当其位整数的时候,则k/2表示将其二进制表示右移一位,k%2 ==0表示其是否是偶数,如果不是则说明当前二进制表示的最右边一位为1,当k==0成立的时候移位结束;
另外还可以使用‘消1’的方法,如果二进制表示A为'****1000',则A-1为'****0111',也就是我们仅关注二进制表示最右边的第一个 1,这样的话A&(A-1)的结果就可以将最右边的第一个1开始往右边的所有位都清除为0,'****0000';所以没进行一次处理就消除一个 1,直到整个数字为0,则A&(A-1)进行的次数就是1的个数;
另外可以使用空间换时间的策略,将int所有取值所对应的1的个数存储为一个数组,则直接取数组值就可以得到;
解题:
出题:判断stack的push和pop序列是否对应,push和pop可能交替发生
分析:例如:push序列"1,2,3,4,5",pop序列"4,5,3,2,1"
解题:
分析:
如果整数表示为k,当其是负数的时候,使用1<<i分别检测k的每一位;当其位整数的时候,则k/2表示将其二进制表示右移一位,k%2 ==0表示其是否是偶数,如果不是则说明当前二进制表示的最右边一位为1,当k==0成立的时候移位结束;
另外还可以使用‘消1’的方法,如果二进制表示A为'****1000',则A-1为'****0111',也就是我们仅关注二进制表示最右边的第一个 1,这样的话A&(A-1)的结果就可以将最右边的第一个1开始往右边的所有位都清除为0,'****0000';所以没进行一次处理就消除一个 1,直到整个数字为0,则A&(A-1)进行的次数就是1的个数;
另外可以使用空间换时间的策略,将int所有取值所对应的1的个数存储为一个数组,则直接取数组值就可以得到;
解题:
int count1Binary(int k) { int count=0; if(k<0) { /** * 针对负数的情况,使用1<<i可以每次检测k的一个 * 位上是否为1,移动次数为sizeof(int),也可以 * 使用while(i){………, i=i<<1}这样当1溢出的时候 * 就是0,也就是结束的时候 * */ int limit=sizeof(int)*8; printf("the size of int is: %d",limit); for(int i=0;i<limit;i++) { if((k & (1 << i)) != 0) count++; } } while(k>0) { /** * 此判断条件可以替换为 k&1 == 1 * */ if(k%2 == 1) { count++; } /** * 移位操作可以替换为 k>>1 * 可以获得更高运算效率 * */ k/=2; } return count; } int count1Binary2(int k) { int count=0; while(k) { k=k&(k-1); count++; } return count; } int main() { printf("\n%d\n", count1Binary(-23)); printf("\n%d\n", count1Binary2(-23)); return 0; }
出题:判断stack的push和pop序列是否对应,push和pop可能交替发生
分析:例如:push序列"1,2,3,4,5",pop序列"4,5,3,2,1"
解题:
/** * 由于当前pop出去的元素肯定位于堆栈的栈顶,所以可以根据 * 这个性质,用push中的元素重建堆栈,创建tempStack,则 * 当前pop出去的元素要么已经位于tempStack的栈顶,要么还 * 在push序列中,如果是后者则需要将对应元素之前的元素都压入 * tempStack。所以如果上述两种情况都没有发生,则失败;如果 * 最终的pop序列和push序列都遍历完全,tempStack非空,则返 * 回true,否则返回失败。 * */ bool judgePushPopSeq(int *push, int pushL, int *pop, int popL) { MyStack *tempStack=new MyStack(); int pushI=0, popI=0; int temp;bool isFound; while(true) { isFound=false; if(tempStack->peek(&temp) && temp==pop[popI]) { isFound=true; tempStack->pop(NULL); popI++; } else { for(int i=pushI;i<pushL;i++) { if(push[i] == pop[popI]) { for(int j=pushI;j<i;j++) { tempStack->push(push[j]); } pushI=i++; popI++; isFound=true; break; } } } if(!isFound) { delete tempStack; return false; } if(popI==popL && pushI==pushL && tempStack->isEmpty()) { delete tempStack; return true; } else { delete tempStack; return false; } } }
相关文章推荐
- <仅是自己做笔记。。。系列-14>输入两个整数序列。其中一个序列表示栈的push顺序, 判断另一个序列有没有可能是对应的pop顺序。
- 微软算法100道题-------输入两个整数序列。其中一个序列表示栈的push顺序, 判断另一个序列有没有可能是对应的pop顺序。
- 【算法】输入两个整数序列。其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序。
- 每天学习一算法系列(27)(输入两个整数序列。其中一个序列表示栈的push 顺序,判断另一个序列有没有可能是对应的pop 顺序)
- 输入两个整数序列。其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序
- 两个整数序列,其中一个序列表示栈的push顺序, 判断另一个序列有没有可能是对应的pop顺序。
- 题目:输入两个整数序列。其中一表示栈的 push 顺序,判断另一个序列有没可能是对应的 pop 顺序
- 题目:输入两个整数序列。其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序。
- 输入两个整数序列。其中一个序列表示栈的push顺序, 判断另一个序列有没有可能是对应的pop顺序。 为了简单起见,我们假设push序列的任意两个整数都是不相等的
- 输入两个整数序列。其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序。为了简单起见,我们假设push序列的任意两个整数都是不相等的。 比如输入的push序列是1、2、3、4、5,那么4、5、3、2、1就有可能是一个pop系列。
- 【练习】输入两个整数序列。其中一个序列表示栈的push 顺序,判断另一个序列有没有可能是对应的pop 顺序
- 输入两个整数序列。其中一个序列表示栈的push顺序, 判断另一个序列有没有可能是对应的pop顺序。 为了简单起见,我们假设push序列的任意两个整数都是不相等的
- PHP 输入两个整数序列。其中一个序列表示栈的push 顺序, 判断另一个序列有没有可能是对应的pop 顺序
- 笔试算法题(35):最长递增子序列 & 判定一个字符串是否可由另一个字符串旋转得到
- 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一
- 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列12345是某栈的压入顺序,序列45321为该压栈序列对应弹出顺序。
- 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一
- 算法习题29:栈的push、pop序列是否一致
- 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一
- 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一