出题:输入一个整数,要求计算此整数的二进制表示中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=;
if(k<) {
/**
* 针对负数的情况,使用1<<i可以每次检测k的一个
* 位上是否为1,移动次数为sizeof(int),也可以
* 使用while(i){………, i=i<<1}这样当1溢出的时候
* 就是0,也就是结束的时候
* */
int limit=sizeof(int)*;
printf("the size of int is: %d",limit);
for(int i=;i<limit;i++) {
if((k & ( << i)) != ) count++;
}
}
while(k>) {
/**
* 此判断条件可以替换为 k&1 == 1
* */
if(k% == ) {
count++;
}
/**
* 移位操作可以替换为 k>>1
* 可以获得更高运算效率
* */
k/=;
} return count;
} int count1Binary2(int k) {
int count=;
while(k) {
k=k&(k-);
count++;
}
return count;
} int main() {
printf("\n%d\n", count1Binary(-));
printf("\n%d\n", count1Binary2(-));
return ;
}

出题:判断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=, popI=;
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):整数二进制表示中的1 & 判定栈的push和pop序列是否对应的更多相关文章

  1. 栈的push、pop序列 【微软面试100题 第二十九题】

    题目要求: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1.2.3.4.5是某栈的压栈序列,序列4.5.3.2.1是该压栈 ...

  2. 每天一道算法题(11)——栈的push、pop 序列

    题目:输入两个整数序列.其中一个序列表示栈的push 顺序,判断另一个序列有没有可能是对应的pop 顺序.为了简单起见,我们假设push 序列的任意两个整数都是不相等的. 例如:输入的push 序列是 ...

  3. 算法题14 小Q歌单,牛客网,腾讯笔试题

    算法题14 小Q歌单,牛客网,腾讯笔试题 题目: 小Q有X首长度为A的不同的歌和Y首长度为B的不同的歌,现在小Q想用这些歌组成一个总长度正好为K的歌单,每首歌最多只能在歌单中出现一次,在不考虑歌单内歌 ...

  4. 【算法题 14 LeetCode 147 链表的插入排序】

    算法题 14 LeetCode 147 链表的插入排序: 解题代码: # Definition for singly-linked list. # class ListNode(object): # ...

  5. 笔试算法题(33):烙饼排序问题 & N!阶乘十进制末尾0的个数二进制最低1的位置

    出题:不同大小烙饼的排序问题:对于N块大小不一的烙饼,上下累在一起,由于一只手托着所有的饼,所以仅有一只手可以翻转饼(假设手足够大可以翻转任意块数的 饼),规定所有的大饼都出现在小饼的下面则说明已经排 ...

  6. 笔试算法题(29):判断元素范围1到N的数组是否有重复数字 & 计算整数的7倍

    出题:一个长度为N的数组,其中的元素取值范围是1到N,要求快速判断数组是否存在重复数字: 分析: 解法1:如果N个元素的范围都是在1到N,所以如果没有重复元素,则每一个位置恰好可以对应数组中的一个元素 ...

  7. 笔试算法题(05):转换BST为双向链表 & 查找栈中的最小元素

    出题:把二元查找树转变成排序的双向链表.输入一棵二元查找树,要求将该二元查找树按照中序转换成一个排序的双向链表,要求不能创建任何新的节点,只能调整指针的指向: 分析: 递归的思路,当前节点需要进行的处 ...

  8. 前端如何应对笔试算法题?(用node编程)

    用nodeJs写算法题 咱们前端使用算法的地方不多,但是为了校招笔试,不得不针对算法题去练习呀! 好不容易下定决心 攻克算法题.发现js并不能像c语言一样自建输入输出流.只能回去学习c语言了吗?其实不 ...

  9. 《剑指offer》-统计整数二进制表示中1的个数

    题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 直观思路就是把二进制表示从右往左统计1的个数.直接想到移位操作来迭代处理.坑点在于负数的移位操作会填充1.有人贴出了逻辑移位 ...

随机推荐

  1. 【141】Adobe Acrobat技巧

    目录: 去除PDF的水印 待定 待定 待定 待定 待定 待定 待定 1. 批量去除PDF文件的水印 用Adobe Acrobat打开PDF文件之后,右侧选择工具>页面>水印>删除,可 ...

  2. redis过期键删除策略以及大key删除方法

    今天遇到了一个前同事挖的坑,刷新缓存中商品信息时先让key过期,然后从数据库里取最新数据然后再放到缓存中,他是这样写的 redisTemplate.expire(CacheConst.GOOGS_PR ...

  3. 本地通信实例(AF_UNIX) (转载)

    转自:http://www.groad.net/bbs/thread-1709-1-1.html 程序说明:  程序里包含服务端和客户端两个程序,它们之间使用 AF_UNIX 实现本机数据流通信.使用 ...

  4. Linux 常用命令八 find

    一.find命令 find命令用于查找文件. 按文件名字查找: wang@wang:~/workpalce/python$ sudo find / -name "create.txt&quo ...

  5. bzoj3118: Orz the MST(线性规划+单纯形法)

    传送门 不难发现,对于每一条树边肯定要减小它的权值,对于每一条非树边要增加它的权值 对于每一条非树边\(j\),他肯定与某些树边构成了一个环,那么它的边权必须大于等于这个环上的所有边 设其中一条边为\ ...

  6. 洛谷P3261 [JLOI2015]城池攻占(左偏树)

    传送门 每一个城市代表的点开一个小根堆,把每一个骑士合并到它开始攻占的城池所代表的点上 然后开始dfs,每一次把子树里那些还活着的骑士合并上来 然后再考虑当前点的堆,一直pop直到骑士全死光或者剩下的 ...

  7. Hdu 5352 MZL's City (多重匹配)

    题目链接: Hdu 5352 MZL's City 题目描述: 有n各节点,m个操作.刚开始的时候节点都是相互独立的,一共有三种操作: 1:把所有和x在一个连通块内的未重建过的点全部重建. 2:建立一 ...

  8. 转-解决Mysql ERROR 1045 (28000): Access denied for user 'root'@'localhost'问题

    ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)   Red Hat Enterpr ...

  9. jsp中提示修改成功

    修改成功提示 servert包 request.setAttribute("success", "修改失败"); 效果而 function f(){ var n ...

  10. js 验证码倒计时效果

    function settime(obj) { if(second == 0){ obj.removeAttribute("disabled"); obj.value=" ...