力扣 2401 最长优雅子数组 859 亲密字符串 167 两数之和II 581 最短无序连续子数组

2401 最长优雅子数组

根据题意可以看出所求的长度就是:nums数组中的元素先转换为二进制,在判断最多有几个元素二进制每位相乘为零。换一种说法就是比如:3,8,48 二进制 3 0000 0011 二进制 8 0000 1000 二进制 48 0011 0000 三个数相或是不是变成59 就是 0011 1011 他们中的1能且仅能出现一次,每次我们都用一个数去维护这个相或的值,记录下长度,就能得出我们想要的结果了。

class Solution {

public:

    int longestNiceSubarray(vector<int>& nums) {

        int res = 0;

        int resCut = 1;

        int j = 0;

        for (int i = 0; i < nums.size(); i++) {

            int res = nums[i];

            for (j = i - 1; j >= 0; j--) {

                if ((res&nums[j]) == 0) {

                    res = res | nums[j];

                }

                else {

                    break;

                }

            }

            resCut = max(resCut, i-j);

        }

        return resCut;

    }

};

859 亲密字符串

解题思路就是:优先考虑false的情况:

1.字符串长度不等2.字符串长度为1 无法实现交换3.超出两处位置不相等4.只有一处位置不相等5.字符串相等,但是所有字符都只出现一次6.两处位置不相等,但字符出现频次不同
综上,用两个vector记录频次,更新的同时记录是否有频次大于1的字符;用一个int记录不相等位置的个数

class Solution {

public:

    bool buddyStrings(string s, string goal) {

        // 长度

        int len_s=s.size(), len_g=goal.size();

        // 字符串长度不等或者为1,false

        if(len_g!=len_s || len_s==1)    return false;

        // 记录字符

        vector<int> vec1(26,0), vec2(26,0);

        int diffNum=0;              // 记录不同的个数

        bool helper=false;

        for(int i=0;i<len_s;++i){

            if(s[i]!=goal[i]){

                if(diffNum==2)  return false;   // 两处以上

                ++diffNum;

            }

            ++vec1[s[i]-'a'];

            ++vec2[goal[i]-'a'];

            if(vec1[s[i]-'a']==2)   helper=true;

        }

        // 只有一处不等,false

        if(diffNum==1)  return false;

        // 相等的字符串,需要判断是否所有字符都只出现一次

        // abc abc false

        if(diffNum==0){

            return helper;

        }

        if(diffNum==2){

            // ab cd false 频次不等

            if(vec1!=vec2){

                return false;

            }

        }

        return true;

    }

};

167 两数之和

本题所给的数组就是后一个大于等于前一个,所以本题思路就是:将从数组的首和尾相加与目标值进行比较,若相等就输出结果,不相等就让尾巴往前提。

class Solution {

public:

    vector<int> twoSum(vector<int>& numbers, int target) {

        for(int j = 0, i = numbers.size() - 1; j < i; j++)

        {

            while(i - 1 > j && numbers[i - 1] + numbers[j] >= target) i--;

            if(numbers[i] + numbers[j] == target) return {j + 1, i + 1};

        }

        return {-1, -1};

    }

};

581 最短无序连续子数组

本题思路就是:找一个数组b来复制一下数组nums,在对数组b进行排序,排序过后让其与nums进行比较,先从前比较,若不相等就结束并记录位置i,再从后比较,若不相等就结束并记录位置j。最后的结果就是j-i+1.

class Solution {

public:

    int findUnsortedSubarray(vector<int>& nums) {

        int i;

        int a1=nums.size();

        int b[a1+1];

        for(i=0;i<a1;i++)

        {

            b[i]=nums[i];

        }

        int j;

        for(i=0;i<a1;i++)

        {

            for(j=i+1;j<a1;j++)

            {

                if(b[i]>b[j])

                {

                    int emp;

                    emp=b[i];

                    b[i]=b[j];

                    b[j]=emp;

                }

            }

        }

    for(i=0;i<a1;i++)

    {

        if(nums[i]!=b[i])

        {

            break;

        }

    }

    for(j=a1-1;j>=0;j--)

    {

        if(nums[j]!=b[j])

        {

            break;

        }

    }

    if(i==a1)

    {

        return 0;

    }

    else {

        return j-i+1;

    }

    }

};

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值