牛客网刷题笔记(四)在线编程
题目一:整数转化
题目描述:
编写一个函数,确定需要改变几个位,才能将整数A转变成整数B。
给定两个整数int A,int B。请返回需要改变的数位个数。
解题思路:
用异或,相同为0,不同为1;
程序代码:
class Transform {
public:
int calcCost(int A, int B) {
// write code here
int amount = A^B;
int count = 0;
while(amount){
count ++;
amount = amount & (amount - 1);
}
return count++;
}
};
题目二:奇偶位交换
题目描述:
请编写程序交换一个数的二进制的奇数位和偶数位。(使用越少的指令越好)
给定一个int x,请返回交换后的数int。
解题思路:
用0xAAAAAAAA与x相与求的奇数位上数字(偶数位上数字为0)
用0x 55555555 与x相与求的偶数位上数字(奇数位上数字为0)
oddVal右移一位 even左移一位 。
程序代码:
class Exchange {
public:
int exchangeOddEven(int x) {
// write code here
int odd = x & (0x55555555);
int even = x & (0xaaaaaaaa);
return (odd << 1) | ((even >> 1)&0x7fffffff);// 无符号右移,高位补0
}
};
题目三:碰撞的蚂蚁
题目描述:
在n个顶点的多边形上有n只蚂蚁,这些蚂蚁同时开始沿着多边形的边爬行,请求出这些蚂蚁相撞的概率。(这里的相撞是指存在任意两只蚂蚁会相撞)
给定一个int n(3<=n<=10000),代表n边形和n只蚂蚁,请返回一个double,为相撞的概率。
解题思路:
考虑不相撞的概率,只有当所有的蚂蚁都朝一个方向(顺时针或者逆时针)爬行时才不会相撞,所以不相撞的概率为:2/2^n.
程序代码:
class Ants {
public:
double antsCollision(int n) {
// write code here
double rat;
rat = 1.0 - pow(0.5,n - 1);
return rat;
}
};
题目四:另类加法
题目描述:
请编写一个函数,将两个数字相加。不得使用+或其他算数运算符。
给定两个int A和B。请返回A+B的值
解题思路:
用位的异或实现加法;
程序代码:
class UnusualAdd {
public:
int addAB(int A, int B) {
// write code here
int Xor, And;
while(B != 0){
Xor = A^B;
And = (A&B)<<1;
A = Xor;
B = And;
}
return A;
}
};
题目五:最近公共祖先
题目描述:
有一棵无穷大的满二叉树,其结点按根结点一层一层地从左往右依次编号,根结点编号为1。现在有两个结点a,b。请设计一个算法,求出a和b点的最近公共祖先的编号。
给定两个int a,b。为给定结点的编号。请返回a和b的最近公共祖先的编号。注意这里结点本身也可认为是其祖先。
解题思路:
满二叉树的父节点是子节点除以2取整的结果,利用这一点找出父节点。如果a != b,就让其中的较大数除以2, 如此循环知道a == b,即可得到原来两个数的最近公共祖先。
程序代码:
class LCA {
public:
int getLCA(int a, int b) {
// write code here
while(a != b){
if(a > b)
a /= 2;
else
b /= 2;
}
return a;
}
};
题目六:二叉树的最大深度
题目描述:
给定一个二叉树,找到最大深度,即找出从根节点到叶节点的最大路径长度。
解题思路:
递归找出二叉树的最大深度;
程序代码:
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int maxDepth(TreeNode *root) {
if(root == NULL )
return 0;
return 1 + max(maxDepth(root ->left), maxDepth(root -> right));
}
};
题目七:词频统计
题目描述:
请设计一个高效的方法,找出任意指定单词在一篇文章中的出现频数。
给定一个string数组article和数组大小n及一个待统计单词word,请返回该单词在文章中的出现频数。保证文章的词数小于等于1000。
解题思路:
利用 .count()函数统计在数组中某个值出现的次数;
程序代码:
class Frequency:
def getFrequency(self, article, n, word):
题目八:abc
题目描述:
设a、b、c均是0到9之间的数字,abc、bcc是两个三位数,且有:abc+bcc=532。求满足条件的所有a、b、c的值。
解题思路:
利用数字的含义,例如:524 = 5100 + 210 +4*1;
程序代码: