第 32 场双周赛

5468. 第 k 个缺失的正整数

  • 严格升序排列 的正整数数组 arr 和整数 k

  • 这个简单啊,我就直接从1开始搜索啊
class Solution {
public:
    int search(vector<int>& arr,int target)
    {
        int start=0;
        int end=arr.size()-1;
        while(start<=end)
        {
            
            int mid=(start+end)/2;
            if(arr[mid]==target)
                return mid;
            if(arr[mid]<target)
                start=mid+1;
            if(arr[mid]>target)
                end=mid-1;
        }
        return -1;
    }
    int findKthPositive(vector<int>& arr, int k) {
        int num=0;
        int target=1;
        while(num!=k)
        {
            if(search(arr,target)==-1)
            {
                num++;
                target++;
            }
            else
            {
                target++;
            }
        }
        return target-1;
    }
};

  • 明显更简单的方法是算gap
  • 遍历数组元素算gap
  • 直到大于k

5469. K 次操作转变字符串

  • 两字符串 s 和 t ,
  • k 次操作以内把字符串 s 转变成 t 。

  • 第 i 次操作时(1 <= i <= k),可如下
    • 选s 中且之前未被选过的任意下标 j (下标从 1 ),
    • 并将此位置的字符切换 i 次。
    • 不进行任何操作。

  • 不就1个1个比较吗
class Solution {
public:
    int shiftNumber(char a,char b)
    {
        if(b>=a)
        {
            return b-a;
        }
        else
        {
            return 26-(a-b);
        }
        
    }
    bool canConvertString(string s, string t, int k) {
        if(s.size()==0 || s.size()!=t.size())
            return false;
        int *start=new int[26];//26个数
        for (int i=0;i<26;i++)
            start[i]=i;
        for (int i=0;i<s.size();i++)//对s和t遍历
        {
            int movenumber = shiftNumber(s[i],t[i]);
            if(movenumber==0)
                continue;
            start[movenumber]+=26;
            movenumber=start[movenumber]-26;
            if(movenumber>k)
                return false;
        }
        return true;
    }
};

未完待续

猜你喜欢

转载自blog.csdn.net/zhoutianzi12/article/details/107888381