LeetCode Learning 2

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值