leetcode 周赛,我来一发马后炮吧。
第一遍读下来没太懂题目意思,后来多读几遍才知道题目所表达的含义:
思路:
1.最长子序列——选择所有0——将 1 与 0 的位置分别用两个数据结构存储;
2.不大于k——从低位到高位对 存储 1 位置的 数据结构进行计算———将计算结果与k对比判断;
ps:注意,直接pow(2,x)会很容易崩溃,需要进行类似“剪枝”的操作,在计算的过程中进行丢弃可能 >k 的情况;
代码:
#include<iostream>
#include<vector>
using namespace std;
bool flag = true;
int longestSubsequence(string s, int k) {
vector<int>s1;
vector<int>s2;
int n = s.size();
for (int i = 0; i < n; i++)
{
if (s[i] == '0')s1.push_back(i);
else s2.push_back(i);
}
int countnum = s1.size();
long int result = 0;
for (int j = s2.size() - 1; j >= 0; j--)
{
int m = n - s2[j]-1;
for (int b = 0; b <= m; b++)
{
if (result+pow(2, b) > k)
{
flag = false;
break;
}
}
if (flag)
{
result += pow(2, m);
countnum++;
}
else
break;
}
cout << countnum;
return countnum;
}
int main()
{
string s;
cin >> s;
int k;
cin >> k;
longestSubsequence(s,k);
return 0;
}
题外话:本来想用 string 分别存储 0 1 的位置 ,但却忘记 char 只有0-9 ,两位数不能由char 表示!!!!!于是在这个上面,浪费了超级久的时间,我真是吐了。
题目总体不难,就是不要投机取巧,要注意提前判断条件是否满足。