LeetCode Learning 2

来源:互联网 发布:电脑数据传输线 编辑:程序博客网 时间:2024/06/05 01:17

292.Nim Game

Difficulty:Easy

题目具体如下:You are playing the following Nim Game with your friend: There is a heap of stones on the table, each time one of you take turns to remove 1 to 3 stones. The one who removes the last stone will be the winner. You will take the first turn to remove the stones.

Both of you are very clever and have optimal strategies for the game. Write a function to determine whether you can win the game given the number of stones in the heap.

For example, if there are 4 stones in the heap, then you will never win the game: no matter 1, 2, or 3 stones you remove, the last stone will always be removed by your friend.

这是一道难度为简单的题。也算是一道数学题吧,只要知道方法就能顺利写出代码,代码没有任何难度。思路就是:无论A拿多少个,B都有办法能拿到和A拿的数目的和为4。所以剩余4个时谁拿谁输,同理剩8个后怎么拿也可能让对方拿到剩余4个。依此类推,只要拿完后剩余4n个,则必败。代码很简单:
class Solution {public:    bool canWinNim(int n) {        if(n<=3)return true;        else if(n%4==0)return false;        else return true;    }};
338. Counting Bits

Given a non negative integer number num. For every numbers i in the range 0 ≤ i ≤ num calculate the number of 1's in their binary representation and return them as an array.

Example:
For num = 5 you should return [0,1,1,2,1,2].

Follow up:

  • It is very easy to come up with a solution with run time O(n*sizeof(integer)). But can you do it in linear time O(n) /possibly in a single pass?
  • Space complexity should be O(n).
  • Can you do it like a boss? Do it without using any builtin function like __builtin_popcount in c++ or in any other language.
Difficulty:Medium.

解题思路:考虑到要利用好之前的数算的结果,而在[2^n,2^(n+1)-1]其实就是[0,2^n-1]对应的数加一,因为只是最高位多了个1,其他都是对应相同的。具体代码如下:

class Solution {public:    vector<int> countBits(int num) {        int t=1,i=0;vector<int> ones;ones.push_back(0);i++;while(t<=num){for(int j=0;j<t&&t+j<=num;j++){ones.push_back(1+ones[j]);}t=2*t;}return ones;    }};



0 0
原创粉丝点击