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;
}
}
};