【Leetcode Sheet】Weekly Practice 2

Leetcode Test

1281 整数的各位积和之差(8.9)

给你一个整数 n,请你帮忙计算并返回该整数「各位数字之积」与「各位数字之和」的差。

提示:

  • 1 <= n <= 10^5

【原始代码】:

int subtractProductAndSum(int n){//1 <= n <= 10^5//except 100000, there're 5 bitsif(n==100000){return -1;}int bits[5]={0,0,0,0,0,0};int cnt=0;while(n>0){bits[cnt++]=n%10;n/=10;}int multi=1,sum=0;for(int i=0;i<cnt;i++){multi*=bits[i];sum+=bits[i];}return (multi-sum);
}

【优化代码】

int subtractProductAndSum(int n) {int m = 1, s = 0;	//m是乘积,sum是求和while (n) {	//当n!=0时int x = n % 10;		//x是n的余数n /= 10;	//n缩小m *= x;		//m进行乘积s += x;		//s进行求和}return m - s;	//返回 乘积-求和
}
//减少位数的存储,空间复杂度为O(1)
//时间复杂度仍然为O(m),m为n的位数

【其他思路】

将n转为字符串,例如n是1234,则char temp=‘1234’

后续直接遍历strlen(temp),计算temp[i]-'0’的值即可

1289 下降路径最小和 II(8.10)

给你一个 n x n 整数矩阵 grid ,请你返回 非零偏移下降路径 数字和的最小值。

非零偏移下降路径 定义为:从 grid 数组中的每一行选择一个数字,且按顺序选出来的数字中,相邻数字不在原数组的同一列。

提示:

  • n == grid.length == grid[i].length
  • 1 <= n <= 200
  • -99 <= grid[i][j] <= 99
int minFallingPathSum(int** grid, int gridSize, int* gridColSize) {int first_min_sum = 0;int second_min_sum = 0;int first_min_index = -1;for (int i = 0; i < gridSize; i++) {    //遍历外层int cur_first_min_sum = INT_MAX;    //记录最小值int cur_second_min_sum = INT_MAX;   //记录次小值int cur_first_min_index = -1;   //记录最小值列编号for (int j = 0; j < gridSize; j++) {    //遍历内层int cur_sum = (j != first_min_index ? first_min_sum : second_min_sum) + grid[i][j];//当前求和计算,如果j和最小值列编号不一样,则添加最小值,否则添加次小值if (cur_sum < cur_first_min_sum) {  //如果当前求和,小于最小cur_second_min_sum = cur_first_min_sum;     //更新次小为之前的最小cur_first_min_sum = cur_sum;    //更新最小为当前的求和cur_first_min_index = j;    //更新比列编号} else if (cur_sum < cur_second_min_sum) {  //如果当前求和,小于次小cur_second_min_sum = cur_sum;   //更新次小为当前的求和}}first_min_sum = cur_first_min_sum;  //更新最小second_min_sum = cur_second_min_sum;    //更新次小first_min_index = cur_first_min_index;  ///更新列编号}return first_min_sum;
}

1572 矩阵对角线元素的和(8.11)

给你一个正方形矩阵 mat,请你返回矩阵对角线元素的和。

请你返回在矩阵主对角线上的元素和副对角线上且不在主对角线上元素的和。

提示:

  • n == mat.length == mat[i].length
  • 1 <= n <= 100
  • 1 <= mat[i][j] <= 100
int diagonalSum(int** mat, int matSize, int* matColSize){//n x n matrixint n=matSize,sum=0;for(int i=0;i<n;i++){for(int j=0;j<n;j++){if((i==j)||(i+j==n-1)){    //i==j 主对角线;i+j==n-1 次对角线sum+=mat[i][j];}}}return sum;
}

2681 英雄的力量(8.1补)

给你一个下标从 0 开始的整数数组 nums ,它表示英雄的能力值。如果我们选出一部分英雄,这组英雄的 力量 定义为:

  • i0i1 ,… ik 表示这组英雄在数组中的下标。那么这组英雄的力量为 max(nums[i0],nums[i1] ... nums[ik])2 * min(nums[i0],nums[i1] ... nums[ik])

请你返回所有可能的 非空 英雄组的 力量 之和。由于答案可能非常大,请你将结果对 109 + 7 取余。

提示:

  • 1 <= nums.length <= 105
  • 1 <= nums[i] <= 109
int cmp(void *a,void *b){return *(int*)a-*(int*)b;
}int sumOfPower(int* nums, int numsSize){qsort(nums,numsSize,sizeof(int),cmp);   //元素的顺序不影响答案,先排序//power = max*max*minint dp = 0, preSum = 0;int res = 0, mod = 1e9 + 7;for (int i = 0; i < numsSize; i++) {dp = (nums[i] + preSum) % mod;preSum = (preSum + dp) % mod;res = (int) ((res + (long long) nums[i] * nums[i] % mod * dp) % mod);if (res < 0) {res += mod;}}return res;
}

23 合并K个升序链表(8.12)

给你一个链表数组,每个链表都已经按升序排列。

请你将所有链表合并到一个升序链表中,返回合并后的链表。

提示:

  • k == lists.length
  • 0 <= k <= 10^4
  • 0 <= lists[i].length <= 500
  • -10^4 <= lists[i][j] <= 10^4
  • lists[i]升序 排列
  • lists[i].length 的总和不超过 10^4
/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/int cmp(const void * a, const void * b)//升序子函数
{return *(int *)a - *(int *)b;
}
struct ListNode* mergeKLists(struct ListNode** lists, int listsSize){if(listsSize == 0 ){return NULL;}int ans[10000];//临时保存链表值int node = 0;for(int i = 0; i <listsSize; i++)//保存所有链表值{while(lists[i]){ans[node++] = lists[i]->val;lists[i] = lists[i]->next;}}qsort(ans, node, sizeof(int), cmp);//排序struct ListNode * h = NULL;struct ListNode * root = NULL;for(int i = 0; i < node; i++)//转换为链表存储{struct ListNode * r = malloc(sizeof(struct ListNode));r->val = ans[i];r->next = NULL;if(root == NULL){h = r;root = r;}else{h->next = r;h = r;}  }return root;
}

88 合并两个有序数组(8.13)

给你两个按 非递减顺序 排列的整数数组 nums1nums2,另有两个整数 mn ,分别表示 nums1nums2 中的元素数目。

请你 合并 nums2nums1 中,使合并后的数组同样按 非递减顺序 排列。

**注意:**最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n

提示:

  • nums1.length == m + n
  • nums2.length == n
  • 0 <= m, n <= 200
  • 1 <= m + n <= 200
  • -109 <= nums1[i], nums2[j] <= 109
int cmp(void *a,void *b){return *(int*)a-*(int*)b;
}void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){int cnt=0,i=m;while(cnt<n){nums1[i++]=nums2[cnt++];}qsort(nums1,(n+m),sizeof(int),cmp);
}

a former method

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){for(int i=0;i!=n;i++){nums1[m+i]=nums2[i];}int minno;for(int i=0;i<m+n-1;i++){minno=i;for(int j=i+1;j<m+n;j++){if(nums1[j]<nums1[minno]){minno=j;}}//找到i后面的最小数,交换i位置和minno位置int temp=nums1[i];nums1[i]=nums1[minno];nums1[minno]=temp;}
}

a new-spaced method: O(n+m) of both time and space

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {int p1 = 0, p2 = 0;int sorted[m + n];	//new-spacedint cur;while (p1 < m || p2 < n) {if (p1 == m) {cur = nums2[p2++];} else if (p2 == n) {cur = nums1[p1++];} else if (nums1[p1] < nums2[p2]) {cur = nums1[p1++];} else {cur = nums2[p2++];}sorted[p1 + p2 - 1] = cur;}for (int i = 0; i != m + n; ++i) {nums1[i] = sorted[i];}
}

617 合并二叉树(8.14)

给你两棵二叉树: root1root2

想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为 null 的节点将直接作为新二叉树的节点。

返回合并后的二叉树。

注意: 合并过程必须从两个树的根节点开始。

提示:

  • 两棵树中的节点数目在范围 [0, 2000]
  • -104 <= Node.val <= 104
/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*///深度优先搜索 dfs
struct TreeNode* mergeTrees(struct TreeNode* root1, struct TreeNode* root2){//如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;//否则,不为 null 的节点将直接作为新二叉树的节点。if(root1 == NULL) return root2;else if(root2 == NULL) return root1;struct TreeNode* result=malloc(sizeof(struct TreeNode));result->val=root1->val + root2->val;result->left=mergeTrees(root1->left,root2->left); 	//左子树递归result->right=mergeTrees(root1->right,root2->right);	//右子树递归return result;
}

C++:

递归,直接在原root1进行修改

class Solution {
public:TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {if (root1 && root2) {root1->val += root2->val;root1->left = mergeTrees(root1->left, root2->left);root1->right = mergeTrees(root1->right, root2->right);}return root1 ? root1 : root2;}
};

另可进行广度优先(较为复杂)

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

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

相关文章

期权就是股指期货吗,哪个好做一点?

近年来&#xff0c;场内ETF期权产品不断扩大&#xff0c;越来越多的投资者有投资期权的想法。当我们看到期权时&#xff0c;我们会不知不觉地想到期货&#xff0c;虽然期货与期权只有一个字的区别&#xff0c;但实际上有很大的不同&#xff0c;那么期权就是股指期货吗&#xff…

批量将excel中第5列中内容将人名和电话号码进行分列

使用Python可以使用openpyxl库来实现批量将Excel中第5列的内容分列为人名和电话号码的操作。下面是示例代码&#xff1a; import openpyxl def split_names_and_phone_numbers(file_path, sheet_name): # 加载Excel文件 workbook openpyxl.load_workbook(file_path) …

jeecg-boot批量导入问题注意事项

现象&#xff1a; 由于批量导入数据速度很快&#xff0c; 因为数据库中的create time字段的时间可能一样&#xff0c;并且jeecg框架自带的是根据生成时间排序&#xff0c; 因此在前端翻页查询的时候&#xff0c;数据每次排序可能会不一样&#xff0c; 会出现第一页已经出现过一…

uniapp选择只选择月份demo效果(整理)

<template><view style"margin-top: 200rpx;"><!-- mode"multiSelector" 多列选择器 --><view><picker :range"years" :value"echoVal" change"yearChange" mode"multiSelector">{…

MySQL 常用函数

一、数学函数 1、ABS(x) 返回绝对值。 mysql> select abs(-4); --------- | abs(-4) | --------- | 4 | --------- 1 row in set (0.00 sec) 2、PI&#xff08;&#xff09; 返回圆周率&#xff0c;并四舍五入保留五位小数。 mysql> select pi(); ----------…

WebRTC | SDP详解

目录 一、SDP标准规范 1. SDP结构 2. SDP内容及type类型 二、WebRTC中的SDP结构 1. 媒体信息描述 &#xff08;1&#xff09;SDP中媒体信息格式 i. “artpmap”属性 ii. “afmtp”属性 &#xff08;2&#xff09;SSRC与CNAME &#xff08;3&#xff09;举个例子 &…

基于GUI的卷积神经网络和长短期神经网络的语音识别系统,卷积神经网的原理,长短期神经网络的原理

目录 背影 卷积神经网络CNN的原理 卷积神经网络CNN的定义 卷积神经网络CNN的神经元 卷积神经网络CNN的激活函数 卷积神经网络CNN的传递函数 长短期神经网络的原理 基于GUI的卷积神经网络和长短期神经网络的语音识别系统 代码下载链接:基于MATLABGUI编程的卷积神经网络和长短期…

idea 本地版本控制 local history

idea 本地版本控制 local history 如何打开 1 自定义快捷键 settings->keymap->搜索框输入 show history -》Add Keyboard Shortcut -》设置为 CtrlAltL 2 右键文件-》local history -》show history 新建文件 版本1&#xff0c;creating class com.geekmice…这个是初…

Vue 2 混入

混入&#xff08;Mixins&#xff09;是一种在Vue组件中重用代码的方式。它允许你定义一些可复用的选项对象&#xff0c;然后将这些选项合并到不同的组件中。混入可以用于在多个组件之间共享逻辑、方法、生命周期钩子等。 示例&#xff1a; <!DOCTYPE html> <html>…

Golang文件操作详解

打开和关闭文件 从 Go 1.16 开始,现在提供了相同的功能 通过包 IO 或包操作系统,以及这些实现 应该在新代码中首选。 有关详细信息,请参阅特定函数文档。 弃用了"io/ioutil"对文件的操作 读取文件方法一(os.open+file.read只读形式): os.Open() 函数能够打开…

LeetCode 面试题 01.03. URL化

文章目录 一、题目二、C# 题解 一、题目 URL化。编写一种方法&#xff0c;将字符串中的空格全部替换为%20。假定该字符串尾部有足够的空间存放新增字符&#xff0c;并且知道字符串的“真实”长度。&#xff08;注&#xff1a;用Java实现的话&#xff0c;请使用字符数组实现&…

clickhouse扩缩容

一、背景 我们之前已经学会了搭建clickhouse集群&#xff0c;我们搭建的是一套单分片两副本的集群&#xff0c;接下来我们来测试下clickhouse的扩缩容情况 二、扩容 扩容相对来说比较简单&#xff0c;我们原来的架构如下 hostshardreplica192.169.1.111192.169.1.212 现在…

学习笔记整理-JS-几种创建对象的方式

文章目录 一、几种创建对象的方式 一、几种创建对象的方式 // 1. 字面量模式 const userA {name: JonA,age: 18 }// 2. Object 构造函数模式 const userB new Object({name: JonB,age: 19 })// 3. 自定义构造函数模式 function UserC() {this.name JonC,this.age 20 } con…

指定或降低Rust 工具链的版本

要更改 Rust 工具链的版本&#xff0c;您可以使用以下命令之一&#xff1a; rustup default stable&#xff1a;使用 stable 版本的 Rust 工具链作为默认版本。rustup default beta&#xff1a;使用 beta 版本的 Rust 工具链作为默认版本。rustup default nightly&#xff1a;使…

WSL2 Ubuntu子系统安装cuda+cudnn+torch

文章目录 前言一、安装cudn二、安装cudnn三、安装pytorch 前言 确保Windows系统版本高于windows10 21H2或Windows11&#xff0c;然后在Windows中将显卡驱动升级到最新即可&#xff0c;WSL2已支持对显卡的直接调用。 一、安装cudn 进入英伟达官网中的cuda下载地址&#xff1…

ansible剧本之role角色模块

role角色 一&#xff1a;Roles 模块1.roles 的目录结构&#xff1a;2.roles 内各目录含义解释3.在一个 playbook 中使用 roles 的步骤&#xff1a;&#xff08;1&#xff09;创建以 roles 命名的目录&#xff08;2&#xff09;创建全局变量目录&#xff08;可选&#xff09;&am…

MAC QT开发攻略

文章目录 基础步骤安装QT、QTCreator安装CMakeNinja 安装Clion编译器在QTCreator中新建项目更改CMake生成器 导入Clion CMake生成文件 基础步骤 安装QT、QTCreator 安装CMake 由于clion需要使用cmake构建 Ninja Ninja下载 安装Clion编译器 Clion 2023.1.3 破解版安装教程…

AI项目二:基于mediapipe的虚拟鼠标控制

若该文为原创文章&#xff0c;转载请注明原文出处。 一、项目介绍 由于博主太懒&#xff0c;mediapipe如何实现鼠标控制的原理直接忽略&#xff0c;最初的想法是想控制摄像头识别手指控制鼠标&#xff0c;达到播放电影的效果。基本上效果也是可以的。简单的说是使用mediapipe检…

UVa247 Calling Circles(Floyd warshall算法)

题意 给定两个人相互打电话&#xff0c;如果a打给b,b打给c,c打给a&#xff0c;则说a,b,c在同一电话圈中。给出n个人的m次通话&#xff0c;输出所有的电话圈 思路 用graph[u][v]1表示u和v之间有打电话。在使用floyd算法计算所有的点对之间的值。graph[u][v]1表示u,v之间有直接…

《TCP IP网络编程》第十八章

第 18 章 多线程服务器端的实现 18.1 理解线程的概念 线程背景&#xff1a; 第 10 章介绍了多进程服务端的实现方法。多进程模型与 select 和 epoll 相比的确有自身的优点&#xff0c;但同时也有问题。如前所述&#xff0c;创建&#xff08;复制&#xff09;进程的工作本身会…