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

矩阵

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. 按公因数计算最大组件大小


代码实现:

思路:森林与并查集

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网工内推 | 网络工程师,13薪,周末双休,华三、华为认证优先

01 路邦远大 招聘岗位&#xff1a;网络工程师 职责描述&#xff1a; 1、配合市场销售人员&#xff0c;做好产品的售后服务工作&#xff1b; 2、负责项目方案安装调试指导以及日常客户使用培训&#xff0c;对客户提出的问题提出解决方案&#xff1b; 3、为客户提供专业、规范的…

图片作为背景的闪白问题,6种基础方案, 不会不知道吧

前言 关于【SSD系列】&#xff1a; 前端一些有意思的内容&#xff0c;旨在3-10分钟里&#xff0c; 500-1500字&#xff0c;有所获&#xff0c;又不为所累。 某天&#xff0c;发现有背景图片的弹出框&#xff0c;会出现闪白现象&#xff0c;这&#xff0c;兄弟们&#xff0c;你…

导入芯片原厂SDK Mirror源码到gerrit

下载镜像代码 repo init --mirror --repo-url ssh://xx/repo.git -u ssh://xx/manifests.git -m manifest.xml repo sync 创建AOSP project 对All Project权限修改 创建repo 在刚才下载的codebase根目录执行如下命令&#xff1a; repo forall -c echo $REPO_PROJECT; ssh -p 29…

C++ AVL树底层实现原理

&#x1f493;博主CSDN主页:麻辣韭菜&#x1f493;   ⏩专栏分类&#xff1a;C知识分享⏪   &#x1f69a;代码仓库:C高阶&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多C知识   &#x1f51d;&#x1f51d; 目录 前言 AVL 树 1.1 AVL树的概念 1.2 AVL树…

【Hadoop大数据技术】——Flume日志采集系统(学习笔记)

&#x1f4d6; 前言&#xff1a;在大数据系统的开发中&#xff0c;数据收集工作无疑是开发者首要解决的一个难题&#xff0c;但由于生产数据的源头丰富多样&#xff0c;其中包含网站日志数据、后台监控数据、用户浏览网页数据等&#xff0c;数据工程师要想将它们分门别类的采集…

永恒之蓝(ms17-010)复现

永恒之蓝 永恒之蓝&#xff08;Eternal Blue&#xff09;爆发于2017年4月14日晚&#xff0c;是一种利用Windows系统的SMB协议漏洞来获取系统的最高权限&#xff0c;以此来控制被入侵的计算机。甚至于2017年5月12日&#xff0c; 不法分子通过改造“永恒之蓝”制作了wannacry勒索…

ARM架构麒麟操作系统安装配置Mariadb数据库

、安装配置JDK (1)检查机器是否已安装JDK 执行 java -version命令查看机器是否安装JDK,一般麒麟操作系统默认安装openjdk 1.8。 (2)安装指定版本JDK 如果麒麟操作系统默认安装的openjdk 1.8不符合需求的话,可以卸载机器安装的openjdk 1.8并按需安装所需的openjdk版本…

软件杯 深度学习人体语义分割在弹幕防遮挡上的实现 - python

文章目录 1 前言1 课题背景2 技术原理和方法2.1基本原理2.2 技术选型和方法 3 实例分割4 实现效果5 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习人体语义分割在弹幕防遮挡上的应用 该项目较为新颖&#xff0c;适合作为竞…

Python爬虫与API交互:如何爬取并解析JSON数据

目录 前言 一、什么是API和JSON数据 二、准备环境 三、发送API请求并获取数据 四、解析JSON数据 五、完整代码示例 六、总结 前言 随着互联网的发展&#xff0c;越来越多的网站提供了API接口&#xff0c;供开发者获取实时数据。在爬虫领域中&#xff0c;与API交互并解析…

快速实现一个Hibernate的例子

写第一个简单的Hibernate程序&#xff1a; 具体的开始第一个Hibernate程序之前: 找到jar包, hibernate 的核心包, mysql数据库的连接驱动包, junit测试包 ①创建Hibernate配置文件 ②创建持久化类 也是和数据库中数据表一一对应这个类 ③创建对象-关系映射文件 ④通过hibern…

【攻防世界】mfw(.git文件泄露)

首先进入题目环境&#xff0c;检查页面、页面源代码、以及URL&#xff1a; 发现页面无异常。 使用 dirsearch 扫描网站&#xff0c;检查是否存在可访问的文件或者文件泄露&#xff1a; 发现 可访问界面/templates/ 以及 .git文件泄露&#xff0c;故使用 GItHack 来查看泄露的 …

LeetCode题练习与总结:不同路径Ⅱ--63

一、题目描述 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish”&#xff09;。 现在考虑网格中有障碍物。那么从…

如何使用SQL注入工具?

前言 今天来讲讲SQL注入工具&#xff0c;sqlmap。如何使用它来一步步爆库。 sqlmap官方地址如下。 sqlmap: automatic SQL injection and database takeover tool 前期准备&#xff0c;需要先安装好docker、docker-compose。 一个运行的后端服务&#xff0c;用于写一个存在…

竞赛 图像识别-人脸识别与疲劳检测 - python opencv

文章目录 0 前言1 课题背景2 Dlib人脸识别2.1 简介2.2 Dlib优点2.3 相关代码2.4 人脸数据库2.5 人脸录入加识别效果 3 疲劳检测算法3.1 眼睛检测算法3.3 点头检测算法 4 PyQt54.1 简介4.2相关界面代码 5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是…

AI大模型创新交汇点:当AI遇见艺术

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

【面试题】细说mysql中的各种锁

前言 作为一名IT从业人员&#xff0c;无论你是开发&#xff0c;测试还是运维&#xff0c;在面试的过程中&#xff0c;我们经常会被数据库&#xff0c;数据库中最经常被问到就是MySql。当面试官问MySql的时候经常会问道一个问题&#xff0c;”MySQL中有哪些锁&#xff1f;“当我…

NAPI 类对象导出及其生命周期管理(上)

1.NAPI 类对象导出 OpenHarmony NAPI提供了一种“包装”C 类和实例的方法&#xff0c;以便JS应用可以调用类的构造函数和方法。Node.js Node-API中关于导出类对象的内容&#xff0c; 1.1. NAPI导出类对象流程 通过napi_define_class定义一个JS类 它包含了与 C 类对应的构造函…

PandasAI的应用与实战解析(一):环境安装、运行demo

文章目录 1.源码包下载、明确依赖版本2.安装python依赖3.运行demo 本博客源码仓库地址&#xff1a;gitlab&#xff0c;本篇博客对应01分支python版本为3.10.x 什么是PandasAI&#xff1f;一句话总结的话&#xff0c;PandasAI就是一个结合了Pandas和AI的开源工具&#xff0c;更…

单链表和文件操作使用练习:通讯录

1. 项目文件组成&#xff08;vs2022&#xff09; 1. Contact.h和Contact.c分别为实现通讯录的头文件和源文件。 2. SList.h和SList.c分别为实现单链表的头文件和源文件。 3. test.c为测试用的源文件&#xff0c;用于调用通讯录提供的函数。 4. Contact.txt用于存储联系人信息。…

蓝桥杯 每日2题 day5

碎碎念&#xff1a;哦哈呦&#xff0c;到第二天也是哦哈哟&#xff0c;&#xff0c;学前缀和差分学了半天&#xff01;day6堂堂连载&#xff01; 0.单词分析 14.单词分析 - 蓝桥云课 (lanqiao.cn) 关于这题就差在input前加一个sorted&#xff0c;记录一下下。接下来就是用字…