牛客網刷題筆記(四)在線編程

題目一:整數轉化

題目描述:ios

編寫一個函數,肯定須要改變幾個位,才能將整數A轉變成整數B。算法

給定兩個整數int A,int B。請返回須要改變的數位個數。數組

解題思路:函數

用異或,相同爲0,不一樣爲1;spa

程序代碼:設計

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++;
  }
};

題目二:奇偶位交換

題目描述:code

請編寫程序交換一個數的二進制的奇數位和偶數位。(使用越少的指令越好)orm

給定一個int x,請返回交換後的數int。遞歸

解題思路:get

用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;
          }
      }
  }
}
相關文章
相關標籤/搜索