2.24 球会落在何处刚刚敲了今天刷新的题目,然后昨天的也写了,就想着更新一下blog
两道题都是模拟题,对于模拟,我的看法就是看懂题目,拿捏细节,难度就不大了。
题目链接:1706. 球会落何处 - 力扣(LeetCode) (leetcode-cn.com)
简述,就是给你一个二维数组,只有1 和 -1,1表示左上角到右下角的斜线,-1是反过来,这些斜线就是挡板,问你从最上面小球落下,看能否到达底部,能填1,不能-1。
思路我在leetcode的题解:模拟 - 球会落何处 - 力扣(LeetCode) (leetcode-cn.com)
这不就是一道小破模拟嘛,想清楚只有碰到V字或者在下降时越过边界才会不能到达底部。
那么问题就转化成什么时候V,同一行如果出现连续两个值不相同,那么是不是一定会V
code(C++)#include2.25 复数乘法#include using namespace std; class Solution { public: /// /// 模拟 有手就行系列 /// 先从列开始,然后遍历行,列的位置不断更新,如果出现越过边界时或者V字形则算不能落在底部 /// 咋算V? /// 同一行变化前前和变化后的数值必须相同 /// so,have hand just ok! /// /// ///vector findBall(vector >& grid) { int m = grid.size(), n = grid[0].size(); vector ans(n); for (int i = 0; i < n; ++i) { // 球的初始列 int col = i; for (auto& row : grid) { int num = row[col]; col += row[col]; // 越过边界或者出现V字形 if (col < 0 || col >= n || row[col] != num) { col = -1; break; } } ans[i] = col; } return ans; } }; int main(int argc, char** argv) { int m, n; cin >> m >> n; vector > grid(m, vector (n)); for (int i = 0; i < m; ++i) { for (int j = 0; j < n; ++j) { cin >> grid[i][j]; } } Solution sol; auto ans = sol.findBall(grid); for (int i = 0; i < n; ++i) { cout << ans[i] << " "; } cout << endl; return 0; }
题目链接:537. 复数乘法 - 力扣(LeetCode) (leetcode-cn.com)
简述,就是给你两个字符串复数,然后算出他们的乘积,返回乘积的字符串形式就行了。
我的题解:简单模拟 - 复数乘法 - 力扣(LeetCode) (leetcode-cn.com)
思路读完题目,很直接啊。先从字符串中取出系数,然后计算出答案的系数最后返回成字符串形式就好了。
这里对系数转字符串,我使用了C++的sstream库的字符串流对象stingstream,这里在多次使用的时候有个小细节,我们需要清空流对象的缓冲区,使用clear()函数可以解决,其实稳妥来写还应该加一句.str("")置空。
code(C++)#include后话#include #include using namespace std; class Solution { public: /// /// 简答模拟 /// 先从字符串中得出系数,需要注意负号 /// 然后根据四个系数计算出答案的系数 /// 将答案转成字符串拼接即可 /// /// 复数1 /// 复数2 ///答案复数 string complexNumberMultiply(string num1, string num2) { // 长长整形系数,我不相信会有超过这个长度的系数!如果超过则需要写一个大数乘法函数 long long a1 = 0, b1 = 0, a2 = 0, b2 = 0; StringToNum(a1, b1, num1); StringToNum(a2, b2, num2); // 计算答案系数 long long a = a1 * a2 - b1 * b2; long long b = a1 * b2 + a2 * b1; // 字符串流,用于将数字转字符串 stringstream ss; string str, ans; ss << a; ss >> str; // 细节,将字符串流清空 ss.clear(); ans = str + "+"; ss << b; ss >> str; ss.clear(); ans += str + "i"; return ans; } private: ////// 从字符串数字中取出系数 /// /// /// /// void StringToNum(long long& a, long long& b, string num) { // 记录是否有负号 bool f1 = false, f2 = f1; // 记录加号 bool flag = false; for (int i = 0; i < num.size() - 1; ++i) { char ch = num[i]; if (ch == '-' && i == 0) { f1 = true; } else if (ch == '-' && i != 0) { f2 = true; } else if (ch == '+') { flag = true; } else if (!flag) { a = a * 10 + (int)(ch - '0'); } else { b = b * 10 + (int)(ch - '0'); } } if (f1) { a = -a; } if (f2) { b = -b; } } }; int main(int argc, char** argv) { string num1, num2; cin >> num1 >> num2; Solution sol; cout << sol.complexNumberMultiply(num1, num2) << endl; return 0; }
最近打了codeforces和牛客的比赛,双双折戟了,可能是太久没有刷算法,退化了,以后还是保持下去。
共勉,uu们。



