Leetcode 每日一题双题版(2.25+2.24)模拟练细节
前言
刚刚敲了今天刷新的题目,然后昨天的也写了,就想着更新一下blog
两道题都是模拟题,对于模拟,我的看法就是看懂题目,拿捏细节,难度就不大了。
2.24 球会落在何处
简述,就是给你一个二维数组,只有1 和 -1,1表示左上角到右下角的斜线,-1是反过来,这些斜线就是挡板,问你从最上面小球落下,看能否到达底部,能填1,不能-1。
我在leetcode的题解:模拟 - 球会落何处 - 力扣(LeetCode) (leetcode-cn.com)
思路
这不就是一道小破模拟嘛,想清楚只有碰到V字或者在下降时越过边界才会不能到达底部。
那么问题就转化成什么时候V,同一行如果出现连续两个值不相同,那么是不是一定会V
code(C++)
#include<iostream>
#include<vector>
using namespace std;
class Solution
{
public:
/// <summary>
/// 模拟 有手就行系列
/// 先从列开始,然后遍历行,列的位置不断更新,如果出现越过边界时或者V字形则算不能落在底部
/// 咋算V?
/// 同一行变化前前和变化后的数值必须相同
/// so,have hand just ok!
/// </summary>
/// <param name="grid"></param>
/// <returns></returns>
vector<int> findBall(vector<vector<int>>& grid)
{
int m = grid.size(), n = grid[0].size();
vector<int> 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<vector<int>> grid(m, vector<int>(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;
}
2.25 复数乘法
简述,就是给你两个字符串复数,然后算出他们的乘积,返回乘积的字符串形式就行了。
我的题解:简单模拟 - 复数乘法 - 力扣(LeetCode) (leetcode-cn.com)
思路
读完题目,很直接啊。先从字符串中取出系数,然后计算出答案的系数最后返回成字符串形式就好了。
这里对系数转字符串,我使用了C++的sstream库的字符串流对象stingstream,这里在多次使用的时候有个小细节,我们需要清空流对象的缓冲区,使用clear()函数可以解决,其实稳妥来写还应该加一句.str(““)置空。
code(C++)
#include<iostream>
#include<string>
#include<sstream>
using namespace std;
class Solution
{
public:
/// <summary>
/// 简答模拟
/// 先从字符串中得出系数,需要注意负号
/// 然后根据四个系数计算出答案的系数
/// 将答案转成字符串拼接即可
/// </summary>
/// <param name="num1">复数1</param>
/// <param name="num2">复数2</param>
/// <returns>答案复数</returns>
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:
/// <summary>
/// 从字符串数字中取出系数
/// </summary>
/// <param name="a"></param>
/// <param name="b"></param>
/// <param name="num"></param>
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们。