1.添加逗号
思路:
没思路
代码:
#define _CRT_SECURE_NO_WARNINGS 1 #include <iostream> #include<string> #include<algorithm> using namespace std; int main() { string a; cin >> a; string ans; int p = 1; for (int i = a.size() - 1; i >= 0; i--) { ans += a[i]; if (p % 3 == 0 && i != 0)ans += ','; p++; } reverse(ans.begin(), ans.end()); cout << ans; } // 64 位输出请用 printf("%lld")
2.跳台阶
思路:
题目要求空间复杂度o1,那就用两个变量迭代斐波那契数列就行。
代码:
#define _CRT_SECURE_NO_WARNINGS 1 #include <iostream> using namespace std; int main() { int n; cin >> n; if (n == 1) { cout << 1 << endl; return 0; } if (n == 2) { cout << 2 << endl; return 0; } long long a = 1, b = 2; long long c; for (int i = 3; i <= n; i++) { c = a + b; a = b; b = c; } cout << c << endl; }
3.扑克牌顺子
思路:
直接思考On做法.On做法不难,主要是还有空间复杂度为O1。这就意味着什么mp,数组统统错误。
回归问题本质,数子0是癞子,不用考虑。用两个变量维护最大值和最小值就行了。中间该如何判断有没有重复元素呢?考虑用一个位图表示。第i位为1,表示i这个数子出现了一次。
如果第i位为1了的情况下,又遇到了i.那就说明重复了直接false
最后判断最大值和最小值的差值。如果差值大于4,不用考虑直接滚。小于4,且没有除了0以外的重复元素,那就一定是可以组成顺子。
代码:
#define _CRT_SECURE_NO_WARNINGS 1 class Solution { public: bool IsContinuous(vector<int>& numbers) { int mx = 0; int mi = 1e9; int s = 0; for (int i = 0; i < numbers.size(); i++) { if (numbers[i] == 0) { continue; } mx = max(mx, numbers[i]); mi = min(mi, numbers[i]); if ((s >> numbers[i]) & 1) { return false; } else { s |= (1 << numbers[i]); } } if (mx - mi > 4) { return false; } return true; } };