牛客网刷题笔记(四)在线编程

题目一:整数转化

题目描述:

编写一个函数,确定需要改变几个位,才能将整数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 AB。请返回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。为给定结点的编号。请返回ab的最近公共祖先的编号。注意这里结点本身也可认为是其祖先。

解题思路:

满二叉树的父节点是子节点除以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):
       # write code here
       return article.count(word)

 

题目八:abc

题目描述:

设a、b、c均是0到9之间的数字,abc、bcc是两个三位数,且有:abc+bcc=532。求满足条件的所有a、b、c的值。

解题思路:

利用数字的含义,例如:524 = 5100 + 210 +4*1;

程序代码:

#include <iostream>
using namespace std;
int main(){
   for (int i = 0;i <= 9;i++){
       for (int j = 0; j <= 9;j++){
           for (int k = 0;k <= 9;k++){
               if (i*100 + j*10 + k + j*100 + k*11 == 532)
                   cout<<i<<" "<<j<<" "<<k<<endl;
          }
      }
  }
}

 

posted @ 2019-03-19 23:22  【SmarT】  阅读(574)  评论(0编辑  收藏  举报