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