题目描述
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
class Solution {
public:
bool isBit(int num,int index){
num>>=index;
return num&1;
}
void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
int res=0;
for(int i=0;i<data.size();i++){
res^=data[i];
}
int index=0;
while((res&1)==0){
res>>=1;
index++;
}
*num1=*num2=0;
for(int i=0;i<data.size();i++){
if(isBit(data[i],index)) *num1^=data[i];
else *num2^=data[i];
}
}
};
面试题 08.11. 硬币
难度中等25收藏分享切换为英文关注反馈
硬币。给定数量不限的硬币,币值为25分、10分、5分和1分,编写代码计算n分有几种表示法。(结果可能会很大,你需要将结果模上1000000007)
示例1:
输入: n = 5 输出:2 解释: 有两种方式可以凑成总金额: 5=5 5=1+1+1+1+1
示例2:
输入: n = 10 输出:4 解释: 有四种方式可以凑成总金额: 10=10 10=5+5 10=5+1+1+1+1+1 10=1+1+1+1+1+1+1+1+1+1
说明:
注意:
你可以假设:
- 0 <= n (总金额) <= 1000000
class Solution {
public:
/*执行用时 :76 ms, 在所有 C++ 提交中击败了53.01%的用户
内存消耗 :14.3 MB, 在所有 C++ 提交中击败了100.00%的用户
「完全背包问题」,「背包方案数问题」,O(n),O(n)*/
int waysToChange(int n) {
vector<int> nums={25,10,5,1};
vector<int> dp(n+1);
dp[0]=1;
for(int i=0;i<4;i++){
int coin=nums[i];
for(int j=coin;j<=n;j++){
dp[j]=(dp[j]+dp[j-coin])%1000000007;
}
}
return dp[n];
}
};