1.下一个排列
想简单了,从后向前两两比较对换或者重排;忘了下面的情况:
应该是存在后面比前面大时,向后找比该数小的前一个数对换!然后就出现了下面的bug…:
还应该将更改过的数后面的数重新排列…(确实是我考虑的太少了,以后得先想清楚再写!)
代码:
class Solution {
public:
void nextPermutation(vector<int>& nums) {
int n=nums.size();
int temp,sign=0;
for(int i=n-1;i>0&&sign!=1;i--){
if(nums[i]>nums[i-1]){
sign=1;//满足,处理后可直接退出
int j=i;
for(;j<n&&nums[i-1]<nums[j];j++){}
if(j<n&&nums[i-1]>=nums[j]){//找到了,与第一位比该数大的换
j--;
temp=nums[j];
nums[j]=nums[i-1];
nums[i-1]=temp;
}else if(j==n){//未找到,判断最后一位
j=n-1;
temp=nums[j];
nums[j]=nums[i-1];
nums[i-1]=temp;
}
//将i及以后的重排为最小
int k=i,m=n-1;
while(k<m){
temp=nums[m];
nums[m]=nums[k];
nums[k]=temp;
k++;
m--;
}
}
}
if(sign==1){//找到符合的或者全部相等
return;
}else{//需要重排
int i=0,j=n-1;
while(i<j){
temp=nums[i];
nums[i]=nums[j];
nums[j]=temp;
i++;
j--;
}
}
return;
}
};
RAND7实现RAND10
以为是概率题了。。。算了一页纸,没法用多次7凑出10,看了答案发现自己想复杂了,只要找到十的倍数个数,其余不是这些数的重新产生即可!一次肯定不够,至少两次,而需要做的就是减少需要重新生成的概率,也就是尽可能多的使用到可以产生的数。(先开始想的相加,毕竟可以产生的数少,但是一算就会发现概率不同,感觉答案给的最好用,见下图)
代码:
// The rand7() API is already defined for you.
// int rand7();
// @return a random integer in the range 1 to 7
class Solution {
public:
int rand10() {
int a,b,num=0;
do{
a=rand7();
b=rand7();
num=(a-1)*7+b;
}while(num>40);
return (num%10)+1;
}
};