NC1 大数加法 牛客题霸
- 关于高精度大数的计算,我之前写过一篇笔记(ACWING 大神的思想模板),可以参考一下高精度
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 计算两个数之和
* @param s string字符串 表示第一个整数
* @param t string字符串 表示第二个整数
* @return string字符串
*/
string solve(string s, string t) {
// write code here
// 为了进位相加的方便 我们将这两个“数”倒着存储
vector<int> A, B;
int lenS = s.size() - 1;
int lenT = t.size() - 1;
// 123456
// 将数字倒着存储
for (int i = lenS; i >= 0; --i) A.push_back(s[i] - '0');
for (int i = lenT; i >= 0; --i) B.push_back(t[i] - '0');
// 6 5 4 3 2 1
vector<int> C; // 最终的结果
int tm = 0; // 初始化进位为0 t = t + Ai + Bi
// 从最低位开始相加
for (int i = 0; i < A.size() || i < B.size(); ++i) {
// 若 A 还没有走完,就加上它
if (i < A.size()) tm += A[i];
// 同理
if (i < B.size()) tm += B[i];
// 把当前的 t 取模后的值插入c
C.push_back(tm % 10);
tm /= 10; //是否有进位,未下一轮准备
}
// 若还有进位就为结果插入进位1
if (tm) C.push_back(1); // C 也是低位在前 6 5 4 3 2 1.。。。
int lenC = C.size();
reverse(C.begin(), C.end());
string str1;
for (int i = 0; i < lenC; ++i) {
str1.push_back(C[i] + '0');
}
return str1;
}
};
- 值得说明一下,若是Python解决这个问题的话,直接用int()函数转换字符串在相加就可以了,不会越界的,因为对于Python来说它的int的范围跟所在机器的系统有关,理论上长度无限(只有内存跟得上),但是C++就不行;所以我们还是好好理解一下高精度算法吧!☺
NC38 螺旋矩阵 牛客题霸
- 模拟题,注意越界啊!
class Solution {
public:
vector<int> spiralOrder(vector<vector<int> >& matrix) {
// 简单模拟
int m = matrix.size(); // 行
vector<int> C;
if (m == 0) return C;
int n = matrix[0].size();// 列
int sum = m * n; // 总的元素个数
// 右 下 左 上 螺旋走 四个边界
int right = n - 1;
int down = m - 1;
int left = 0;
int up = 0;
int i = 0; // 存储数组的量
int idx = 0; // 当前走到的矩阵元素
// 记得每次要刷新一下边界,因为存完之后,会减少
while (1) {
// 四个方向如何走
// 从左往右走
for (idx = left; idx <= right; idx++) {
C.push_back(matrix[up][idx]);
i++;
}
up++;
if (i >= sum) break; // 若是超过总的个数,就停止了
// 从上往下走
for (idx = up; idx <= down; idx++) {
C.push_back(matrix[idx][right]);
i++;
}
right--;
if (i >= sum) break; // 若是超过总的个数,就停止了
// 从右向左走
for (idx = right; idx >= left; idx--) {
C.push_back(matrix[down][idx]);
i++;
}
down--;
if (i >= sum) break; // 若是超过总的个数,就停止了
// 从下往上走
for (idx = down; idx >= up; idx--) {
C.push_back(matrix[idx][left]);
i++;
}
left++;
if (i >= sum) break; // 若是超过总的个数,就停止了
}
return C;
}
};