第196场周赛-记录第一次参加周赛

第196场周赛-记录第一次参加周赛

准备刷题的时候刚好看到有一场周赛,就试了试,果然还是太菜了

四道题,一个半小时

第一题

5452. 判断能否形成等差数列

给你一个数字数组 arr 。

如果一个数列中,任意相邻两项的差总等于同一个常数,那么这个数列就称为 等差数列 。

如果可以重新排列数组形成等差数列,请返回 true ;否则,返回 false 。

示例 1:

输入:arr = [3,5,1]
输出:true
解释:对数组重新排序得到 [1,3,5] 或者 [5,3,1] ,任意相邻两项的差分别为 2 或 -2 ,可以形成等差数列。
示例 2:

输入:arr = [1,2,4]
输出:false
解释:无法通过重新排序得到等差数列。

提示:

2 <= arr.length <= 1000
-10^6 <= arr[i] <= 10^6

简单题,思路就是排序后判断相邻数差是否相同,相同返回true,否则停止遍历返回false

class Solution {
public:
    bool canMakeArithmeticProgression(vector<int>& arr) {
        sort(arr.begin(),arr.end());
        int n, i=0, j;
        j = arr[i] - arr[i+1];
        n = arr.size();
        for(i;i<n-1;i++)
        {
            if((arr[i]-arr[i+1])==j)
                continue;
            else return false;
        }
        return true;
    }
};

一次通过,耗时5min。 (代码能力还是太差,看大佬这题用了1min)
下一题

1503. 所有蚂蚁掉下来前的最后一刻

有一块木板,长度为 n 个 单位 。一些蚂蚁在木板上移动,每只蚂蚁都以 每秒一个单位 的速度移动。其中,一部分蚂蚁向 左 移动,其他蚂蚁向 右 移动。

当两只向 不同 方向移动的蚂蚁在某个点相遇时,它们会同时改变移动方向并继续移动。假设更改方向不会花费任何额外时间。

而当蚂蚁在某一时刻 t 到达木板的一端时,它立即从木板上掉下来。

给你一个整数 n 和两个整数数组 left 以及 right 。两个数组分别标识向左或者向右移动的蚂蚁在 t = 0 时的位置。请你返回最后一只蚂蚁从木板上掉下来的时刻。
提示:

1 <= n <= 10^4
0 <= left.length <= n + 1
0 <= left[i] <= n
0 <= right.length <= n + 1
0 <= right[i] <= n
1 <= left.length + right.length <= n + 1
left 和 right 中的所有值都是唯一的,并且每个值 只能出现在二者之一 中。

这题看了好一会,最后发现可以不用管掉头,因为两个相遇的蚂蚁都掉头之后就相当于都没掉头继续前行。所以题目长,其实就是找左数组里的最小值和右数组的最大值,然后用长度减最小值与最大值比较,得到的最大值就是结果。

因为题目用的vector数组,所以要自己找最小值最大值。

class Solution {
public:
    int getLastMoment(int n, vector<int>& left, vector<int>& right) {
        int i, m, temp, anws, r_min = INT_MAX, l_max = 0;
        m = right.size();
        for (i=0;i<m;i++)
            if(right[i]<r_min)
                r_min = right[i];
        m = left.size();
        for (i=0;i<m;i++)
            if(left[i]>l_max)
                l_max = left[i];
        return max((l_max),(n-r_min));
    }
};

用时20min。(大佬2min就做完了)

之后看了一眼第三题,跳过了,花了很久做最后一题,直到最后也没做出来,但是结束了之后就做出来了。。

5455. 最多 K 次交换相邻数位后得到的最小整数

给你一个字符串 num 和一个整数 k 。其中,num 表示一个很大的整数,字符串中的每个字符依次对应整数上的各个 数位 。

你可以交换这个整数相邻数位的数字 最多 k 次。

请你返回你能得到的最小整数,并以字符串形式返回。

示例 1:
在这里插入图片描述
输入:num = “4321”, k = 4
输出:“1342”
解释:4321 通过 4 次交换相邻数位得到最小整数的步骤如上图所示。

思路简单,判断k能否完全遍历数组,能的话找最小值,不能的话找k个值的最小值,然后k减掉移动的长度。

比赛的时候超时,做不出来,想不到怎么优化,出来之后发现加上如果字符串长度的平方比k小的话就可以把字符串完全排序,加上这一句就能双100了

class Solution {
public:
    string minInteger(string num, int k) {
        int i, j, n, m=0, min=INT_MAX;
        string temp;
        n = num.length();
        if (num.size() * num.size() < k) {
            sort(num.begin(), num.end());
            return num;
        }
        while(k>0&&m<n)
        {
            if(m+k>=n){
                for(i=m;i<n;i++)
                {
                    if(num[i]<min)
                    {
                        min = num[i];
                        j = i;
                    }
                }
                temp = num[j];
                num.erase(j, 1);
                num.insert(m, temp);
                k = k - j + m;
                min = INT_MAX;
                m++;
            }
            else if(m+k<n){
                for(i=m;i<(m+k+1);i++)
                {
                    if(num[i]<min)
                    {
                        min = num[i];
                        j = i;
                    }
                }
                temp = num[j];
                num.erase(j,1);
                num.insert(m,temp);
                k = k - j + m;
                min = INT_MAX;
                m++;
            }
        }
        return num;
    }
};

第三题目前还没做,做了在补。

感想

太菜,好在进步空间挺大,继续刷题总结进步吧。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值