【英雄九日集训】(七月第一轮)第一天——数组

2319. Check if Matrix Is X-Matrix
599. Minimum Index Sum of Two Lists
674. Longest Continuous Increasing Subsequence
989. Add to Array-Form of Integer

第一题 2319

  (1)暴力求解,两个循环遍历二维数组下标
  (2)两次判断,对角线元素为零时false,非对角线元素不为零时false
注意
  起初因为思考方向是先return true而纠结了很久
  先return判断条件较少的结果

class Solution {
public:
    bool checkXMatrix(vector<vector<int>>& grid) {
        for(int i = 0; i<grid.size(); i++){
            for(int j = 0; j<grid.size(); j++){
                if(i == j || i+j == grid.size()-1){
                    if(grid[i][j] == 0){
                        return false;
                    }
                }
                else if(grid[i][j] != 0){
                    return false;
                }
            }
        }
        return true;
    }
};

第二题 599

  (1)暴力求解,两个循环遍历两个一维字符串数组下标
  (2)找到相同字符串后,记录索引和,并与min比较大小
  (3)如果是更小的索引和,就把这个字符串复制给str
  (2)如果是相同的索引和,就把这个字符串添加在str末尾
注意
  str = { list1[i] }大括号不可省略,否则会报错
  if(list1[i] == list2[j])作为判断条件时,要用双等号

class Solution {
public:
    vector<string> findRestaurant(vector<string>& list1, vector<string>& list2) {
        int ans, min = 2000;
        vector<string> str;
        for(int i = 0; i < list1.size(); i++){
            for( int j = 0; j < list2.size(); j++){
                if(list1[i] == list2[j]){
                    ans = i + j;
                    if(ans < min){
                        min = ans;
                        str = { list1[i] };
                    }
                    else if(ans == min){
                        str.push_back( list1[i] );
                    }
                }
            }
        }
        return str;
    }
};

第三题 674

  (1)循环遍历数组下标
  (2)如果前一个数大于等于当前数,则不是构成递增序列,当前结果存储为1,否则长度自加
  (3)取较大值存储为结果
注意
  一开始弄错了判断条件+没有设置res的初始值,导致结果完全错误

class Solution {
public:
    int findLengthOfLCIS(vector<int>& nums) {
        int ans = 1, res = 1;
        for(int i = 1; i < nums.size(); i++){
            if(nums[i-1] >= nums[i]){
                res = 1;
            }
            else res ++;
            ans = max(ans, res);
        }
        return ans;
    }
};

第四题 989

  (1)把k逐位存储为数组
  (2)翻转数组,便于计算数组长度,从下标0开始加起
  (3)遍历数组,逐位相加,保留进位
注意
  这道题不难,但是出现了一些平时见不到的函数,需要了解并记住=.=
  在计算进位的时候容易出错,因此可以使用测试用例测试9999+1的结果是否正确

class Solution {
public:
    vector<int> addToArrayForm(vector<int>& num, int k) {
        vector<int> numk, ans;                       //定义一维容器 numk 和 ans (以我目前的知识储备来看,类似于一维数组)
        while( k ){                                  //在 k > 0 的情况下循环,将 k 从个位开始,逐位分解并存进一维容器 numk
            numk.push_back( k % 10 );                //把 k / 10 的余数(即 k 的个位)(取余 k )存进 numk 的末尾
            k /= 10;                                 //去除 k 的个位
        }
        reverse(num.begin(), num.end());             //翻转 num ,使得个位的下标为0
        int carry = 0, len = max(num.size(), numk.size());
        for(int i = 0; i < len; ++i){
        //用一行代码表示 if / else ,妙
            int a = i < num.size() ? num[i] : 0;     //如果 i < num.size(),a = num[i],否则 a = 0
            int b = i < numk.size() ? numk[i] : 0;   //如果 i < num.size(),a = num[i],否则 a = 0
            int now = (a + b + carry) % 10;          //存储当前结果为 now ,取余 10 ,防止因进位使数字变成两位数
            carry = (a + b + carry) / 10;            //更新进位标记
            ans.push_back(now);                      //把 now 存进 ans 末尾
        }
        if(carry){                                   //如果最后一个数也存在进位,就在末尾添加一个1
            ans.push_back(1);
        }
        reverse(ans.begin(), ans.end());             //翻转 ans ,得到最终答案
        return ans;
    }
};

你可能感兴趣的:(leetcode,leetcode,算法,职场和发展)