第71次双周赛总结

拆分数位后四位数字的最小和

image-20220206173301647

解答

class Solution {
public:
    int minimumSum(int num) {
        vector<int> a(4);
        a[0]=num/1000;
        a[1]=(num-a[0]*1000)/100;
        a[2]=(num-a[0]*1000-a[1]*100)/10;
        a[3]=num-a[0]*1000-a[1]*100-a[2]*10;
        sort(a.begin(),a.end());
        return (a[0]+a[1])*10+a[2]+a[3];
    }
};

tzxydby 大佬的解答

思路是转化成字符串再排序


class Solution 
{
public:
  int minimumSum(int num) 
  {
    string s=to_string(num);
    sort(s.begin(),s.end());
    return (s[0]+s[1]-'0'*2)*10+s[2]+s[3]-'0'*2;
  }
};

根据给定数字划分数组

image-20220206173743680

题解

class Solution {
public:
    vector<int> pivotArray(vector<int>& nums, int pivot) {
        vector<int> a;
        int flag_equal=0,j=0;
        for(int i=0;i<nums.size();i++)
        {
            if(nums[i]<pivot)
            {
                nums[j]=nums[i];
                j++;
            }
            else if(nums[i]==pivot)
                flag_equal++;
            else if(nums[i]>pivot)
            {
                a.push_back(nums[i]);
            }
        }
        for(;flag_equal>0;j++,flag_equal--)
            nums[j]=pivot;
        for(int i=0;j<nums.size();j++,i++)
            nums[j]=a[i];
        return nums;

    }
    
};

三个数组实现

还是上面大佬的题解

using namespace std;
class Solution 
{
public:
    vector<int>pivotArray(vector<int>& a,int p) 
    {
        vector<int>z,c,d;
        for(auto j:a)
        {
            if(j<p)
                z.push_back(j);
            else if(j==p)
                c.push_back(j);
            else 
                d.push_back(j);
        }
        for(auto j:c)
            z.push_back(j);
        for(auto j:d)
            z.push_back(j);
        return z;
    }
};

for(auto a:b)用法

C11新特性

for(auto a:b)中b为一个容器,效果是利用a遍历并获得b容器中的每一个值,但是a无法影响到b容器中的元素。

for(auto &a:b)中加了引用符号,可以对容器中的内容进行赋值,即可通过对a赋值来做到容器b的内容填充。

设置时间的最少代价

这题自己想复杂了

参考答案

对每一个分钟数的情况进行讨论

class Solution {
public:
    int minCostSetTime(int s, int v, int p, int t) {
    	int res=-1;
        for (int i=0;i*60<=t&&i<=99;i++)
        {
        	int x=t-i*60;
        	if (x>99) continue;//秒的时间超了
        	int nowv=0;
        	static int a[5];
        	a[4]=x%10;
        	a[3]=x/10;
        	a[2]=i%10;
        	a[1]=i/10;
        	int nowl=0;
        	for (int j=1;j<=4;j++)
        	{
        		if (a[j]==0) nowl++;
        		else break;
        	}
        	int nows=s;//nows就是现在的手指数字
        	for (int j=nowl+1;j<=4;j++)//注意是从下标0开始存储的
        	{
        		if (nows!=a[j]) nowv+=v;//加上移动时间
        		nowv+=p;//加上按压时间
                nows=a[j];
        	}
        	if (res==-1) res=nowv;
        	else res=min(res,nowv);
        }
        return res;
        		
    }
};

删除元素后和的最小差值

image-20220206181802218

题目不长但是很难

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值