2021-09-05Leecode

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,看了答案发现自己想复杂了,只要找到十的倍数个数,其余不是这些数的重新产生即可!一次肯定不够,至少两次,而需要做的就是减少需要重新生成的概率,也就是尽可能多的使用到可以产生的数。(先开始想的相加,毕竟可以产生的数少,但是一算就会发现概率不同,感觉答案给的最好用,见下图)
使用前40个,其余9个重来
代码:

// 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;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值