周末因为有事木有参加周赛,不影响做两个题目看看水平;其实更应该把之前的坑补上,比如go的学习,然后用go刷题!
1. 题目1
1.1 问题
给你一个由大小写英文字母组成的字符串 s 。
一个整理好的字符串中,两个相邻字符 s[i] 和 s[i + 1] 不会同时满足下述条件:
0 <= i <= s.length - 2
s[i] 是小写字符,但 s[i + 1] 是相同的大写字符;反之亦然 。
请你将字符串整理好,每次你都可以从字符串中选出满足上述条件的 两个相邻 字符并删除,直到字符串整理好为止。
请返回整理好的 字符串 。题目保证在给出的约束条件下,测试样例对应的答案是唯一的。
注意:空字符串也属于整理好的字符串,尽管其中没有任何字符。
示例 1:
输入:s = “leEeetcode”
输出:“leetcode”
解释:无论你第一次选的是 i = 1 还是 i = 2,都会使 “leEeetcode” 缩减为 “leetcode” 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/make-the-string-great
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
1.2 思路
- 按照逻辑处理字符串,处理完一遍如果字符串有变化,需要再处理一轮
1.3 代码
class Solution {
public:
string makeGood(string s) {
bool needFlag = true;
while(needFlag) {
needFlag = false;
//cout <<s << endl;
for (int i = 0; i+1 < s.length(); i++) {
int len = s.length();
if (s[i] >= 'a' && s[i] <= 'z' && s[i]-'a'==s[i+1]-'A') {
if (i+2 < len && len-i-1 > 0) {
s = s.substr(0, i) + s.substr(i+2, len-i-1);
} else {
s = s.substr(0, i);
}
needFlag = true;
}
else if (s[i] >= 'A' && s[i] <= 'Z' && s[i]-'A'==s[i+1]-'a') {
if (i+2 < len && len-i-1 > 0) {
s = s.substr(0, i) + s.substr(i+2, len-i-1);
} else {
s = s.substr(0, i);
}
needFlag = true;
}
//cout <<"one level: " << s << " " << s.length() << " " << i << endl;
}
}
return s;
}
};
//bug
/*
for (int i = 0; i+1 < s.length(); i++) {
两种不同的语法
for (int i = 0; i < s.length()-1; i++) {
*/
2. 题目2
2.1 问题
给你两个正整数 n 和 k,二进制字符串 Sn 的形成规则如下:
S1 = “0”
当 i > 1 时,Si = Si-1 + “1” + reverse(invert(Si-1))
其中 + 表示串联操作,reverse(x) 返回反转 x 后得到的字符串,而 invert(x) 则会翻转 x 中的每一位(0 变为 1,而 1 变为 0)
例如,符合上述描述的序列的前 4 个字符串依次是:
S1 = “0”
S2 = “011”
S3 = “0111001”
S4 = “011100110110001”
请你返回 Sn 的 第 k 位字符 ,题目数据保证 k 一定在 Sn 长度范围以内。
示例 1:
输入:n = 3, k = 1
输出:“0”
解释:S3 为 “0111001”,其第 1 位为 “0” 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-kth-bit-in-nth-binary-string
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2.2 思路
- 减而治之思想:在midpos前,在n-1里面找;=midpos,直接返回;>midpos,也找n-1的对应位置
2.3 超时代码
class Solution {
public:
char findKthBit(int n, int k) {
vector<int> t;
t.push_back(0);
for (int i = 2; i <= n; i++) {
t.push_back(1);
for (int j=t.size()-2; j >= 0; j--) {
//cout << "j: " << j << " v: " << t[j] << " " << (t[j]^1) << endl;
t.push_back(t[j]^1);
}
/*for (int j = 0; j < t.size(); j++)
cout << t[j];
cout << endl;*/
}
return char(t[k-1]+'0');
}
};
2.3 AC代码
class Solution {
public:
// too long time method two
char findKthBit(int n, int k) {
//减而治之的思想
if (n == 1)
return '0';
int midpos = 1 << (n-1);
if (k == midpos)
return '1';
else if (k < midpos) {
return findKthBit(n-1, k);
} else {
char c = findKthBit(n-1, 2*midpos-k);
if (c == '0')
return '1';
else
return '0';
}
}
};