NC1 大数加法 牛客题霸和NC38 螺旋矩阵 牛客题霸

151 阅读2分钟

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;
    }
};