力扣—2024 春招冲刺百题计划

news2024/11/27 1:09:20

矩阵

1. 螺旋矩阵

代码实现:

/*
 * @param matrix int整型二维数组 
 * @param matrixRowLen int matrix数组行数
 * @param matrixColLen int* matrix数组列数
 * @return int整型一维数组
 * @return int* returnSize 返回数组行数
*/
int* spiralOrder(int **matrix, int matrixRowLen, int *matrixColLen, int *returnSize) {
    int s = 0, x = matrixRowLen - 1, z = 0, y = *matrixColLen - 1; // s = 上, x = 下, z = 左, y = 右
    int len = matrixRowLen * *matrixColLen;
    int *arr = (int*)malloc(sizeof(int) * len);
    int count = 0;
    while (1) {
        for (int i = z; i <= y; i++) { // 从左到右
            arr[count++] = matrix[s][i];
        }
        if (count >= len) {
            break; 
        }
        for (int i = s + 1; i < x; i++) { // 从上到下
            arr[count++] = matrix[i][y];
        }
        if (count >= len) {
            break;
        }
        for (int i = y; i >= z; i--) { // 从右到左
            arr[count++] = matrix[x][i];
        }
        if (count >= len) { 
            break;
        }
        for (int i = x - 1; i > s; i--) { // 从下到上
            arr[count++] = matrix[i][z];
        }
        if (count >= len) {
            break;
        }
        s++;
        x--;
        z++;
        y--;
    }
    *returnSize = len;
    return arr;
}

2. 生命游戏

代码实现:

int dir[8][2] = {
    {-1, -1}, {-1, 0}, {-1, 1}, {0, -1}, {0, 1}, {1, -1}, {1, 0}, {1, 1}
};
int getLifeCellNum(int **board, int boardSize, int *boardColSize, int m, int n) {
    int i, j;
    int x, y;
    int result = 0;
    for (i = 0; i < 8; i++) {
        x = m + dir[i][0];
        y = n + dir[i][1];
        if ((x >= 0) && (x < boardSize) && (y >= 0) && (y < boardColSize[x])) {
            if (board[x][y] == 1) {
                result++;
            }
        }
    }
    return result;
}

void gameOfLife(int **board, int boardSize, int *boardColSize) {
    int i, j;
    if ((board == NULL) || (boardSize == 0) || (boardColSize == NULL)) {
        return;
    }
    int **tmp = (int**)malloc(sizeof(int *) * boardSize);
    for (i = 0; i < boardSize; i++) {
        tmp[i] = (int*)malloc(sizeof(int) * boardColSize[i]);
    }

    for (i = 0; i < boardSize; i++) {
        for (j = 0; j < boardColSize[i]; j++) {
            tmp[i][j] = getLifeCellNum(board, boardSize, boardColSize, i, j);
        }
    }
    for (i = 0; i < boardSize; i++) {
        for (j = 0; j < boardColSize[i]; j++) {
            if (board[i][j]) {
                if ((tmp[i][j] != 2) && (tmp[i][j] != 3)) {
                    board[i][j] = 0;
                }
            } else {
                if (tmp[i][j] == 3) {
                    board[i][j] = 1;
                }
            }
        }
    }
    for (i = 0; i < boardSize; i++) {
        free(tmp[i]);
    }
    free(tmp);
    return;
}

3. 旋转图像

代码实现:

方法一:使用辅助数组

void rotate(int **matrix, int matrixSize, int *matrixColSize) {
    int a[matrixSize][matrixSize];
    for (int i = 0; i < matrixSize; i++) {
        for (int j = 0; j < matrixSize; j++) {
            a[i][j] = matrix[i][j];
        }
    }
    for (int i = 0; i < matrixSize; i++) {
        for (int j = 0; j < matrixSize; j++) {
            matrix[j][matrixSize - i - 1] = a[i][j];
        }
    }
}

方法二:先将矩阵(x, y)转置,在左右对称即可实现90度顺时针旋转

void rotate(int **matrix, int matrixSize, int *matrixColSize){
    // 先进行矩阵的转置
    for (int i = 0; i < matrixSize; i++){
        for (int j = i; j < *matrixColSize; j++){
            int temp = matrix[i][j];
            matrix[i][j] = matrix[j][i];
            matrix[j][i] = temp;
        }
    }
    // 在将矩阵左右对称转换
    int left = 0, right = (*matrixColSize) - 1;
    while (left < right) {
        for (int i = 0; i < matrixSize; i++) {
            int temp = matrix[i][left];
            matrix[i][left] = matrix[i][right];
            matrix[i][right] = temp;
        }
        left++;
        right--;
    }
}

4. 矩阵置零

代码实现:

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] = 1;
            }
        }
    }
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            if (row[i] || col[j]) {
                matrix[i][j] = 0;
            }
        }
    }
}

1. 有效的括号


代码实现:

bool isValid(char *s) {
    char stack[10000];
    int top = -1;
    while (*s) {
        if (*s == '(' || *s == '{' || *s == '[') {
            stack[++top] = *s;
        } else {
            if (top == -1) { // 栈空
                return false;
            }
            char top_val = stack[top]; // 获取栈顶元素
            if (top_val == '(' && *s != ')' || top_val == '[' && *s != ']' || top_val == '{' && *s != '}') {
                return false;
            } else {
                top--;
            }
        }
        s++;
    }
    if (top != -1) {
        return false;
    }
    return true;
}

2. 二叉树的中序遍历


代码实现:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */

#define MAX_NODE 100

// 递归
// void mid_order1(struct TreeNode *root, int *res, int *returnSize) {
//     if (root == NULL) { // 终止条件
//         return;
//     }
//     mid_order1(root->left, res, returnSize);
//     res[(*returnSize)++] = root->val;
//     mid_order1(root->right, res, returnSize);
// }

// 迭代(非递归) 深度优先搜索---借用栈
void mid_order2(struct TreeNode *root, int *res, int *returnSize) {
    if (root == NULL) {
        return ;
    }
    struct TreeNode *stack[MAX_NODE]; // 定义一个栈
    int top = -1; // 栈顶
    struct TreeNode *p = root;
    struct TreeNode *q = NULL;
    while (p || top != -1) {
		if (p) {
			stack[++top] = p;
			p = p->left;
		} else {
			q = stack[top];
			res[(*returnSize)++] = q->val;
            top--;
			p = q->right;
		}
	}
}

int* inorderTraversal(struct TreeNode *root, int *returnSize) {
    int *res = malloc(sizeof(int) * MAX_NODE);
    *returnSize = 0;
    // mid_order1(root, res, returnSize);
    mid_order2(root, res, returnSize);
    return res;
}

3. 移掉K位数字

代码实现:

思路:贪心 + 单调栈

char* removeKdigits(char *num, int k) {
    int n = strlen(num), top = -1;
    char *stack = malloc(sizeof(char) * n);
    for (int i = 0; i < n; i++) {
        while (top > -1 && stack[top] > num[i] && k) {
            top--;
            k--;
        }
        stack[++top] = num[i];
    }
    top -= k;

    char *ans = malloc(sizeof(char) * (n + 1));
    int ansSize = 0;
    bool flag = true;
    for (int i = 0; i <= top; i++) {
        if (flag && stack[i] == '0') {
            continue;
        }
        flag = false;
        ans[ansSize++] = stack[i];
    }
    if (ansSize == 0) {
        ans[0] = '0';
        ans[1] = 0;
    } else {
        ans[ansSize] = 0;
    }
    return ans;
}

4. 去除重复字母

代码实现:

char* removeDuplicateLetters(char *s) {
    int hash[26] = {0};
    int vis[26] = {0};
    int n = strlen(s);
    for (int i = 0; i < n; i++) {
        hash[s[i] - 'a']++;
    }
    char *stack = malloc(sizeof(char) * (n + 1));
    int top = -1;
    for (int i = 0; i < n; i++) {
        if (!vis[s[i] - 'a']) {
            while (top > -1 && stack[top] > s[i]) {
                if (hash[stack[top] - 'a'] > 0) {
                    vis[stack[top--] - 'a'] = 0;
                } else {
                    break;
                }
            }
            vis[s[i] - 'a'] = 1;
            stack[++top] = s[i];
        }
        hash[s[i] - 'a'] -= 1;
    }
    stack[++top] = '\0';
    return stack;
}

😭5. 拼接最大数

代码实现:

数论

1. 计数质数

代码实现:

方法一:暴力—超时
bool isPrime(int x) {
    for (int i = 2; i * i <= x; i++) {
        if (x % i == 0) {
            return false;
        }
    }
    return true;
}

int countPrimes(int n) {
    int ans = 0;
    for (int i = 2; i < n; ++i) {
        ans += isPrime(i);
    }
    return ans;
}
方法二:埃氏筛
如果 x 是质数,那么 x 的倍数:2x, 3x,…一定不是质数
int countPrimes(int n) {
    if (n < 2) {
        return 0;
    }
    int isPrime[n];
    memset(isPrime, 1, sizeof(isPrime));
    int ans = 0;
    for (int i = 2; i < n; i++) {
        if (isPrime[i]) {
            ans += 1;
            for (int j = i + i; j < n; j += i) {
                isPrime[j] = 0;
            }
        }
    }
    return ans;
}

2. n的第K个因子

代码实现:

int kthFactor(int n, int k){
    int i, j = 0;
    int count = 0;
    for(i = 1; i <= n; i++){
        if (n % i == 0){
            count++;
            if (count == k) {
                return i;
            }
        }
    }
    return -1;
}

3. 找出数组的做大公约数

代码实现:

int findGCD(int *nums, int numsSize) {
    int i;
    int min = INT_MAX, max = INT_MIN;

    // 找到最大值和最小值
    for (i = 0; i < numsSize; i++) {
        if (nums[i] > max) {
            max = nums[i];
        }
        if (nums[i] < min) {
            min = nums[i];
        }
    }
    for (i = min; i > 0; i--) {
        if (max % i == 0 && min % i == 0) { 
            return i;
        }
    }
    return 1;
}

4. 生成乘积数组的方案数

代码实现:

方法一:回溯—超时

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */

int path[10000];
int pathSize;

void dfs(int k, int num, int sum, int *count) {
    if (sum > num) {
        return;
    }
    if (pathSize == k) {
        if (sum == num) {
            (*count)++;
            *count %= 1000000007;
        }
        return;
    }
    for (int i = 1; i <= num; i++) {
        path[pathSize++] = i;
        dfs(k, num, sum * i, count);
        pathSize--;
    }
}

int* waysToFillArray(int **queries, int queriesSize, int *queriesColSize, int *returnSize){
    int *res = malloc(sizeof(int) * queriesSize);
    for (int i = 0; i < queriesSize; i++) {
        pathSize = 0;
        int count = 0;
        dfs(queries[i][0], queries[i][1], 1, &count);
        res[i] = count;
    }
    *returnSize = queriesSize;
    return res;
}

5. 按公因数计算最大组件大小


代码实现:

思路:森林与并查集

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1582073.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言 | Leetcode C语言题解之第19题删除链表的倒数第N个结点

题目&#xff1a; 题解&#xff1a; struct ListNode* removeNthFromEnd(struct ListNode* head, int n) {struct ListNode* dummy malloc(sizeof(struct ListNode));dummy->val 0, dummy->next head;struct ListNode* first head;struct ListNode* second dummy;f…

蓝桥杯嵌入式(G431)备赛笔记——UART

printf的重定向 为了方便使用&#xff0c;通过keil中的Help功能的帮助&#xff0c;做一个printf的重定向 搜索fputc&#xff0c;复制这段 将复制的那段放入工程中&#xff0c;并添加串口发送的函数 关键代码 u8 rx_buff[30]; // 定义一个长度为30的接收缓冲区数组rx_buff u8…

C++初阶:6.string类

string类 string不属于STL,早于STL出现 看文档 C非官网(建议用这个) C官网 文章目录 string类一.为什么学习string类&#xff1f;1.C语言中的字符串2. 两个面试题(暂不做讲解) 二.标准库中的string类1. string类(了解)2. string类的常用接口说明&#xff08;注意下面我只讲解…

数组与链表:JavaScript中的数据结构选择

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

单片机之蜂鸣器

目录 蜂鸣器介绍 蜂鸣器的分类 发声原理分类 按有源无源分类 三极管驱动 蜂鸣器原理 音符与频率对照表 蜂鸣器播放130.8Hz的声音 仿真案例 蜂鸣器发声 电路图 keil文件 蜂鸣器播放音乐 歌曲数据获得 使用的频率 keil文件 蜂鸣器介绍 前言&#xff1a;蜂鸣器是…

SpringBoot中注册Bean的方式汇总

文章目录 ComponentScan Componet相关注解BeanImportspring.factories总结Configuration和Component的主要区别&#xff1f;Bean是不是必须和Configuration一起使用&#xff1f;Import导入配置类有意义&#xff1f;出现异常&#xff1a;java.lang.NoClassDefFoundError: Could…

巨控GRM230远程智能模块:定义未来智慧水务的新篇章

标签:#智能模块 #自动化控制 #远程监控 #水质检测 #无线数据传输 在如今这个快速发展的时代&#xff0c;智能化已经成为了各行各业升级转型的关键词。尤其在水务管理领域&#xff0c;传统的手动操作和监控方法逐渐不能满足现代化的需求&#xff0c;而巨控科技推出的GRM230远程…

Docker容器嵌入式开发:MySQL表的外键约束及其解决方法

本文内容涵盖了使用MySQL创建数据库和表、添加数据、处理字符集错误、解决外键约束问题以及使用SQL查询数据的过程。通过创建表、插入数据和调整字符集等操作&#xff0c;成功解决了数据库表中的字符集问题&#xff0c;并使用INSERT语句向各个表中添加了示例数据。同时&#xf…

12.C++常用的算法_遍历算法

文章目录 遍历算法1. for_each()代码工程运行结果 2. transform()代码工程运行结果 3. find()代码工程运行结果 遍历算法 1. for_each() 有两种方式&#xff1a; 1.普通函数 2.仿函数 代码工程 #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<vect…

【三十九】【算法分析与设计】综合练习(5),79. 单词搜索,1219. 黄金矿工,980. 不同路径 III

79. 单词搜索 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 单词必须按照字母顺序&#xff0c;通过相邻的单元格内的字母构成&#xff0c;其中“相邻”单元格是那些水平…

二豆写作能用吗 #笔记#笔记

二豆写作是一款非常好用、靠谱、方便的论文写作工具&#xff0c;它能帮助用户快速完成论文写作&#xff0c;并且具有查重降重的功能。那么&#xff0c;二豆写作到底能不能用呢&#xff1f;答案是肯定的&#xff0c;二豆写作绝对是值得推荐的。 首先&#xff0c;二豆写作提供了丰…

不定长顺序表

一.不定长顺序表的结构: typedef struct DSQList{ int* elem;//动态内存的地址 int length;//有效数据的个数 int listsize;//总容量 }DSQList,*DPSQList; 很明显,为了能实现扩容(否则如何实现再次判满呢?),我们必须要在定长顺序表的基础上增加一个总容量;结构示意图如下: 二…

基于ros的相机内参标定过程

基于ros的相机内参标定过程 1. 安装还对应相机的驱动2. 启动相机节点发布主题3. 下载camera_calibartion4. 将红框的文件夹复制在自己的工作空间里边&#xff0c;编译5. 标定完成以后&#xff0c;生成内参参数文件camera.yaml。将文件放在对应的路径下&#xff0c;修改config文…

(二)ffmpeg 拉流推流示例

一、搭建流媒体服务器 在这里&#xff0c;选用的流媒体服务器是mediamtx。 下载地址&#xff1a;https://github.com/bluenviron/mediamtx/releases/tag/v1.6.0 系统不同选择的压缩包不同&#xff0c;我用的是ubuntu系统。 下载下来之后进行解压&#xff0c;可以看到里面有三…

【随笔】Git 高级篇 -- 最近标签距离查询 git describe(二十一)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…

Android 属性动画及自定义3D旋转动画

Android 动画框架 其中包括&#xff0c;帧动画、视图动画&#xff08;补间动画&#xff09;、属性动画。 在Android3.0之前&#xff0c;视图动画一家独大&#xff0c;之后属性动画框架被推出。属性动画框架&#xff0c;基本可以实现所有的视图动画效果。 视图动画的效率较高…

常见性能测试工具对比

在性能测试工作中&#xff0c;我们常常会遇到好几个工具&#xff0c;但是每一个工具都有自己的优势&#xff0c;一时间不知道怎么选择。 今天我们就将性能测试常用的工具进行对比&#xff0c;这样大家在选择工具的时候心里就有底啦&#xff01; 阿里云PTS 性能测试PTS&#xff…

25. 文档测试

作为下午题出现的几率很低&#xff1b; 主要议题&#xff1a; 1.软件文档分类 2.用户文档的内容 用户文档测试的作用&#xff1a; 3.用户文档测试需要注意的问题 4.用户文档测试的要点 5.用户手册测试 6.在线帮助测试

安卓的认证测试

1 CTS CTS 是 Android 兼容性测试套件&#xff0c;用于验证设备是否符合 Android 平台的兼容性标准。它包含一系列测试用例&#xff0c;涵盖了设备的各个方面&#xff0c;如硬件功能、软件功能、API 的正确实现等。通过 CTS 测试&#xff0c;设备厂商可以确保其设备符合 Andro…

工单管理系统设计方案,工单系统的流程

工单管理系统是一种用于管理和跟踪工作流程的软件系统。它可以帮助企业和组织更好地分配任务、优化工作流程、提高生产效率和客户满意度。下面是一个基本的工单管理系统设计方案&#xff1a;需求分析  在设计工单管理系统之前&#xff0c;需要进行需求分析&#xff0c;确定系…