牛客编程巅峰赛S1第11场 - 青铜&白银 A B 题解

题目链接:https://ac.nowcoder.com/acm/contest/6911

看之前,希望老铁们来个三连击,给更多的人看到这篇文章

1、给俺点个赞呗,可以让更多的人看到这篇文章,顺便激励下我,嘻嘻。

2、老铁们,关注我的原创微信公众号**「Grand Theft Algorithm」**,专注于写算法题解 + 计算机基础知识。关注回复01送你算法大礼包!

A题

签到,判断不能得到0用map判断一下之前是否出现过同样的数即可,出现过说明陷入循环肯定得不到。

重点细节在于n < 0时就直接返回 -1,因为数一直在缩小,不会等于0了

代码

class Solution {
public:
    /**
     * 
     * @param n long长整型 
     * @return int整型
     */
    int Numberofoperations(long long n) {
        int res = 0;
        map<long long, int> mp;
        while(1) {
            if(n % 2 == 1) {
                n -= 3;
            } else {
                n /= 2;
            }
            res++;
            cout << "()" << n << ", " << res << endl;
            if(n == 0) {
                return res;
            } else if(mp[n] > 0 || n < 0) {
                return -1;
            } else {
                mp[n] = 1;
            }
        }
    }
};

B题

跟我们公众号写过的一道LeetCode题目基本一致,用一个栈存放遍历到的元素,每次比较栈顶元素和字符串当前遍历到的字符关系,进行简单处理即可

重点细节在于可能会出现两个0消掉变成一个1时,可能会跟原来栈里面有的1相邻。其实可以直接pop两个0然后再跟栈顶比较,但是还得判断栈是否为空太麻烦了,我直接让字符串遍历到的字符变成‘1’,然后把指针往回挪一步,接着留给下次循环判断得了

代码

class Solution {
public:
    /**
     * 
     * @param str string字符串 初始字符串
     * @return string字符串
     */
    string solve(string s) {
        string res = "";
        stack<char> a;
        int len = s.size();
        for(int i = 0; i < len; i++) {
            if(a.empty()) {
                a.push(s[i]);
            } else if(a.top() == '0' && s[i] == '0') {
                a.pop();
                s[i] = '1';
                i--;
            } else if(a.top() == '1' && s[i] == '1') {
                a.pop();
            } else {
                a.push(s[i]);
            }
        }
        while(!a.empty()) {
            res = a.top() + res;
            a.pop();
        }
        return res;
    }
};

有收获?希望老铁们来个三连击,给更多的人看到这篇文章

1、给俺点个赞呗,可以让更多的人看到这篇文章,顺便激励下我,嘻嘻。

2、老铁们,关注我的原创微信公众号**「Grand Theft Algorithm」**,专注于写算法题解 + 计算机基础知识

你可能感兴趣的:(牛客编程巅峰赛S1第11场 - 青铜&白银 A B 题解)