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


    题目一:整数转化

    题目描述:

    编写一个函数,确定需要改变几个位,才能将整数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;
              }
          }
      }
    }

     

  • 相关阅读:
    还得还得学啊
    感觉自己写的东西很死板啊
    好烦啊,不知道选哪个?
    222
    111
    愁人啊
    ssm+ajax实现登陆
    ssm框架搭建
    抽象类与接口
    代理设计模式
  • 原文地址:https://www.cnblogs.com/ST-2017/p/10562224.html
Copyright © 2020-2023  润新知