打卡leetcode第18天

1.重塑矩形

【题目】

 

【分析】

 

 【C】

int** matrixReshape(int** nums, int numsSize, int* numsColSize, int r, int c, int* returnSize, int** returnColumnSizes) {
    int m = numsSize;
    int n = numsColSize[0];
    if (m * n != r * c) {
        *returnSize = numsSize;
        *returnColumnSizes = numsColSize;
        return nums;
    }
    *returnSize = r;
    *returnColumnSizes = malloc(sizeof(int) * r);
    int** ans = malloc(sizeof(int*) * r);

    for (int i = 0; i < r; i++) {
        (*returnColumnSizes)[i] = c;
        ans[i] = malloc(sizeof(int) * c);
    }
    for (int x = 0; x < m * n; ++x) {
        ans[x / c][x % c] = nums[x / n][x % n];
    }
    return ans;
}

2.有效的数独

【题目】

 

 

 

【分析】

【C++】

class Solution {
public:
    bool isValidSudoku(vector<vector<char>>& board) {
        // 声明行、列、九宫格的哈希表,均初始化为 0
        vector<vector<int>> row(9, vector<int> (9, 0));
        vector<vector<int>> col(9, vector<int> (9, 0));
        vector<vector<int>> group(9, vector<int> (9, 0));

        for (int i = 0; i < 9; i ++) {
            // 不论是按行按列还是按九宫格,都是 9 组,所以外层循环 9 次
            for (int j = 0; j < 9; j ++) {
                int c = board[i][j] - '1';
                if (board[i][j] == '.') continue;
                int idx = (i / 3) * 3 + j / 3;
                if (row[i][c] != 0 || col[j][c] != 0 || group[idx][c] != 0) return false;
                row[i][c] ++;
                col[j][c] ++;
                group[idx][c] ++;
            }
        }
        return true;
    }
};

语法补充:

【C】

bool isValidSudoku(char** board, int boardSize, int* boardColSize){
        int rows[9][9];
        int columns[9][9];
        int subboxes[3][3][9];
        
        memset(rows,0,sizeof(rows));
        memset(columns,0,sizeof(columns));
        memset(subboxes,0,sizeof(subboxes));
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                char c = board[i][j];
                if (c != '.') {
                    int index = c - '0' - 1;
                    rows[i][index]++;
                    columns[j][index]++;
                    subboxes[i / 3][j / 3][index]++;
                    if (rows[i][index] > 1 || columns[j][index] > 1 || subboxes[i / 3][j / 3][index] > 1) {
                        return false;
                    }
                }
            }
        }
        return true;
}

3.矩阵置零

【题目】

【分析】

使用标记数组

我们可以用两个标记数组分别记录每一行和每一列是否有零出现。

具体地,我们首先遍历该数组一次,如果某个元素为 000,那么就将该元素所在的行和列所对应标记数组的位置置为 true\text{true}true。最后我们再次遍历该数组,用标记数组更新原数组即可

【C】

void setZeroes(int** matrix, int matrixSize, int* matrixColSize){
    int m=matrixSize;
    int n=matrixColSize[0];
    int row[m],col[n];
    memset(row,0,sizeof(row));
    memset(col,0,sizeof(col));
    for(int i=0;i<m;i++){
        for(int j=0;j<n;j++){
            if(!matrix[i][j]){
                row[i]=col[j]=true;
            }
        }
    }
    for(int i=0;i<m;i++){
        for(int j=0;j<n;j++){
            if(row[i]||col[j]){
                matrix[i][j]=0;
            }
        }
    }
}

 

4.删除排序数组中的重复项

【题目】

【分析】

快慢指针,从下标为1开始,然后依次比较

int removeDuplicates(int* nums, int numsSize){
        if(numsSize==0){
            return 0;
        }
        int fast=1,slow=1;
        while(fast<numsSize){
            if(nums[fast]!=nums[fast-1]){
                nums[slow]=nums[fast];
              slow++;
            }
            fast++;
        }
        return slow;
}

5.最后一个单词的长度

【题目】

【分析】

由于字符串中至少存在一个单词,因此字符串中一定有字母。首先找到字符串中的最后一个字母,该字母即为最后一个单词的最后一个字母。

从最后一个字母开始继续反向遍历字符串,直到遇到空格或者到达字符串的起始位置。遍历到的每个字母都是最后一个单词中的字母,因此遍历到的字母数量即为最后一个单词的长度

int lengthOfLastWord(char * s){
    int index=strlen(s)-1;
    while(s[index]==' '){
        index--;
    }
    int count=0;
    while(index>=0&&s[index]!=' '){
        index--;
        count++;
    }
    return count;
}

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值