Leetcode C++ 《第201场周赛》

周末因为有事木有参加周赛,不影响做两个题目看看水平;其实更应该把之前的坑补上,比如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 <
            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';
        }
    }
};

你可能感兴趣的:(刷题)