题目链接: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」**,专注于写算法题解 + 计算机基础知识