CSDN每日一题学习训练——Java版(字符串相乘、子集、删除链表的倒数第 N 个结点)
版本说明
当前版本号[20231112]。
版本 | 修改说明 |
---|---|
20231112 | 初版 |
目录
文章目录
- 版本说明
- 目录
- 字符串相乘
- 题目
- 解题思路
- 代码思路
- 补充说明
- 参考代码
- 子集
- 题目
- 解题思路
- 代码思路
- 参考代码
- 删除链表的倒数第 N 个结点
- 题目
- 解题思路
- 代码思路
- 参考代码
字符串相乘
题目
给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。
示例 1:
输入: num1 = “2”, num2 = “3”
输出: “6”
示例 2:
输入: num1 = “123”, num2 = “456”
输出: “56088”
说明:
num1 和 num2 的长度小于110。
num1 和 num2 只包含数字 0-9。
num1 和 num2 均不以零开头,除非是数字 0 本身。
不能使用任何标准库的大数类型(比如 BigInteger)或直接将输入转换为整数来处理。
解题思路
- 首先判断输入的两个字符串是否为0,如果是则直接返回"0"。
- 获取两个字符串的长度m和n。
- 创建一个长度为m+n-1的整数数组intRes,用于存储乘积的结果。
- 使用两层循环遍历num1和num2的每一位数字,将它们相乘并累加到intRes数组中对应的位置。
- 从intRes数组的末尾开始向前遍历,如果当前位置的值大于等于10,则需要进位。将当前位置的值除以10,并将余数加到前一位上。
- 将intRes数组转换为字符串形式,即为最终的乘积结果。
代码思路
-
首先判断输入的两个字符串是否为"0",如果是,则直接返回"0",因为任何数与0相乘都等于0。
// 如果num1或num2为"0",则直接返回"0"if (num1.equals("0") || num2.equals("0"))return "0";
-
获取两个字符串的长度m和n,分别表示num1和num2的位数。
// 获取num1的长度mint m = num1.length();// 获取num2的长度nint n = num2.length();
-
创建一个长度为m+n-1的整型数组intRes,用于存储相乘结果的每一位数字。
// 创建一个长度为m+n-1的整型数组intRes,用于存储相乘结果的每一位数字int[] intRes = new int[m + n - 1];
-
使用两层循环遍历num1和num2的每一位数字,将它们相乘的结果累加到intRes数组中对应的位置上。这里需要注意的是,由于num1和num2是字符串表示的整数,所以在计算时需要将字符转换为对应的数字值(通过减去字符’0’的ASCII码值)。
// 使用两层循环遍历num1和num2的每一位数字for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {// 将num1的第i位数字与num2的第j位数字相乘,然后加上intRes数组中对应位置的值intRes[i + j] += (num1.charAt(i) - 48) * (num2.charAt(j) - 48);}}
-
对intRes数组进行进位处理。从数组的最后一位开始向前遍历,如果当前位的数字大于等于10,则需要将其除以10并加上前一位的值。同时,将当前位的值更新为除以10后的余数。
// 从intRes数组的最后一位开始向前遍历,如果当前位的数字大于等于10,则需要将其除以10并加上前一位的值for (int i = intRes.length - 1; i > 0; i--) {if (intRes[i] >= 10) {intRes[i - 1] += intRes[i] / 10;intRes[i] %= 10;}}
-
最后,将intRes数组中的每个元素转换为字符串,拼接起来得到最终的相乘结果。拼接起来,形成最终的乘积结果。这个结果被赋值给变量res,并作为方法的返回值。
// 遍历intRes数组,将每个元素转换为字符串并拼接到res中for (int i = 0; i < intRes.length; i++) {res += String.valueOf(intRes[i]);}// 返回最终的相乘结果return res;}
补充说明
1、为什么在代码思路第3的步骤里,创建一个整型数组intRes是长度为 m+n-1 的呢?
int[] intRes = new int[m + n - 1];
在这段代码中,m + n - 1用于初始化一个长度为m + n - 1的整数数组intRes。这个数组用于存储两个字符串num1和num2相乘的结果。
具体来说,如果num1的长度为m,num2的长度为n,那么num1和num2相乘的结果的最大位数就是m + n - 1。
因此,我们需要创建一个长度为m + n - 1的数组来存储结果。
2、在代码思路第4的步骤里,在计算时该怎么将字符转换为对应的数字值呢,又是为什么要减去48呢?
intRes[i + j] += (num1.charAt(i) - 48) * (num2.charAt(j) - 48);
这段代码的目的是将两个字符串表示的数字相乘,并将结果存储在一个整数数组中。
(num1.charAt(i) - 48)
/ (num2.charAt(j) - 48)
:将num1/num2的第i位字符转换为对应的数字值。
- 这里减去48是因为字符’0’的ASCII码值为48,
- 所以通过减去48可以将字符转换为对应的数字值
- (例如,字符’2’的ASCII码值为50,减去48后得到数字2)。
参考代码
这段代码是一个用于实现两个字符串表示的整数相乘的算法。
class Solution {public String multiply(String num1, String num2) {if (num1.equals("0") || num2.equals("0"))return "0";int m = num1.length();int n = num2.length();int[] intRes = new int[m + n - 1];for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {intRes[i + j] += (num1.charAt(i) - 48) * (num2.charAt(j) - 48);}}for (int i = intRes.length - 1; i > 0; i--) {if (intRes[i] >= 10) {intRes[i - 1] += intRes[i] / 10;intRes[i] %= 10;}}String res = "";for (int i = 0; i < intRes.length; i++) {res += String.valueOf(intRes[i]);}return res;}
}
子集
题目
给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。
示例 1:
输入:nums = [1,2,3]
输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
示例 2:
输入:nums = [0]
输出:[[],[0]]
提示:
1 <= nums.length <= 10
-10 <= nums[i] <= 10
nums 中的所有元素 互不相同
解题思路
- 创建一个空的结果列表 res,用于存储所有可能的子集。
- 创建一个临时列表 tmp,用于存储当前正在构建的子集。
- 将空列表添加到结果列表 res 中。
- 如果输入数组 nums 的长度为 0,直接返回结果列表 res。
- 调用辅助函数 helper,传入输入数组 nums、起始索引 0、临时列表 tmp 和结果列表 res。
- 在辅助函数 helper 中,遍历输入数组 nums 从起始索引 start 开始的所有元素。 a. 将当前元素添加到临时列表 tmp 中。 b. 递归调用辅助函数 helper,传入输入数组 nums、当前元素的下一个索引 i + 1、临时列表 tmp 和结果列表 res。 c. 将当前临时列表 tmp 的副本添加到结果列表 res 中。 d. 移除临时列表 tmp 中的最后一个元素,回溯到上一步。
- 返回结果列表 res。
代码思路
-
定义一个名为
Solution
的类,其中包含两个方法:subsets
和helper
。 -
subsets
方法是主方法,它接受一个整数数组nums
作为输入,并返回一个包含所有子集的列表。public List<List<Integer>> subsets(int[] nums)
-
在
subsets
方法中,首先创建一个空的结果列表res
和一个临时列表tmp
,然后将tmp
添加到res
中。List<List<Integer>> res = new ArrayList<List<Integer>>(); // 存储结果的列表List<Integer> tmp = new ArrayList<>(); // 临时列表,用于存储当前子集res.add(tmp); // 将空子集添加到结果列表中
-
如果输入数组
nums
的长度为0,则直接返回结果列表res
。if (nums.length == 0) // 如果输入数组为空,直接返回结果列表return res;
-
调用辅助方法
helper
,传入输入数组nums
、起始索引0、临时列表tmp
和结果列表res
。helper(nums, 0, tmp, res); // 调用辅助函数,生成子集
-
helper
方法是一个递归方法,用于生成所有可能的子集。它接受四个参数:输入数组nums
、当前处理的起始索引start
、临时列表tmp
和结果列表res
。// 辅助函数,递归生成子集public void helper(int[] nums, int start, List<Integer> tmp, List<List<Integer>> res)
-
在
helper
方法中,使用一个循环从起始索引start
开始遍历输入数组nums
。for (int i = start; i < nums.length; i++)
-
在每次循环中,将当前元素添加到临时列表
tmp
中,然后递归调用helper
方法,传入下一个索引i + 1
、更新后的临时列表tmp
和结果列表res
。tmp.add(nums[i]); // 将当前元素添加到临时列表中helper(nums, i + 1, tmp, res); // 递归调用辅助函数,处理下一个元素
-
在递归调用返回后,将当前的临时列表
tmp
复制一份,并将其添加到结果列表res
中。res.add(new ArrayList<Integer>(tmp)); // 将当前临时列表复制一份,添加到结果列表中
-
最后,从临时列表
tmp
中移除最后一个元素,以便在下一次循环中处理下一个元素。tmp.remove(tmp.size() - 1); // 移除临时列表中的最后一个元素,回溯到上一步
-
当循环结束时,所有的子集都已经生成并添加到结果列表
res
中,最终返回该列表。
参考代码
这段代码是一个求解给定数组的所有子集的算法。它使用了回溯法来生成所有可能的子集,并将它们存储在一个列表中返回。
class Solution {public List<List<Integer>> subsets(int[] nums) {List<List<Integer>> res = new ArrayList<List<Integer>>();List<Integer> tmp = new ArrayList<>();res.add(tmp);if (nums.length == 0)return res;helper(nums, 0, tmp, res);return res;}public void helper(int[] nums, int start, List<Integer> tmp, List<List<Integer>> res) {for (int i = start; i < nums.length; i++) {tmp.add(nums[i]);helper(nums, i + 1, tmp, res);res.add(new ArrayList<Integer>(tmp));tmp.remove(tmp.size() - 1);}}
}
删除链表的倒数第 N 个结点
题目
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
进阶:你能尝试使用一趟扫描实现吗?
示例 1:
输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]
示例 2:
输入:head = [1], n = 1
输出:[]
示例 3:
输入:head = [1,2], n = 1
输出:[1]
提示:
链表中结点的数目为 sz
1 <= sz <= 30
0 <= Node.val <= 100
1 <= n <= sz
解题思路
- 创建一个虚拟头节点
v
,并将其指向原链表的头结点head
。这样做的目的是方便处理边界情况,例如当需要删除的是头结点时。 - 使用一个循环遍历整个链表,将每个节点添加到一个列表
index
中。这样我们可以方便地访问链表中的任意节点。 - 计算要删除的节点的前一个节点和后一个节点在列表中的索引位置。前一个节点的索引为
index.size() - n - 1
,后一个节点的索引为index.size() - n + 1
。 - 根据计算出的索引位置,更新前一个节点的
next
指针,使其指向后一个节点或null
(如果后一个节点不存在)。 - 返回虚拟头节点
v
的下一个节点,即删除倒数第n个节点后的链表头结点。
代码思路
-
创建一个虚拟头节点v,并将其指向原链表头节点head。这样做是为了方便处理边界情况,例如当需要删除的是头节点时。
// 移除链表中倒数第n个节点的方法public ListNode removeNthFromEnd(ListNode head, int n) {ListNode v = new ListNode(0, head); // 创建一个虚拟头节点,指向原链表头节点
-
创建一个名为handle的指针,指向虚拟头节点v。
ListNode handle = v; // 创建一个指针,指向虚拟头节点
-
创建一个名为index的列表,用于存储链表中所有节点的引用。
List<ListNode> index = new ArrayList<>(); // 创建一个列表,用于存储链表中所有节点的引用
-
使用while循环遍历链表,将每个节点的引用添加到index列表中。
// 遍历链表,将每个节点的引用添加到列表中while (v != null) {index.add(v);v = v.next;}
-
计算要删除的节点的前一个节点和后一个节点在index列表中的索引位置pre和next。
// 计算要删除的节点的前一个节点和后一个节点在列表中的索引位置int pre = index.size() - n - 1;int next = index.size() - n + 1;
-
根据pre和next的值,更新前一个节点的next指针,使其指向后一个节点或null(如果后一个节点不存在)。
// 更新前一个节点的next指针,使其指向后一个节点或null(如果后一个节点不存在)index.get(pre).next = next >= 0 && next < index.size() ? index.get(next) : null;
-
返回处理后的链表头节点handle.next。
// 返回处理后的链表头节点return handle.next;
参考代码
这段代码是用于删除链表中倒数第n个节点。
public class ListNode {int val;ListNode next;ListNode() {}ListNode(int val) {this.val = val;}ListNode(int val, ListNode next) {this.val = val;this.next = next;}
}
class Solution {public ListNode removeNthFromEnd(ListNode head, int n) {ListNode v = new ListNode(0, head);ListNode handle = v;List<ListNode> index = new ArrayList<>();while (v != null) {index.add(v);v = v.next;}int pre = index.size() - n - 1;int next = index.size() - n + 1;index.get(pre).next = next >= 0 && next < index.size() ? index.get(next) : null;return handle.next;}
}
相关文章:

CSDN每日一题学习训练——Java版(字符串相乘、子集、删除链表的倒数第 N 个结点)
版本说明 当前版本号[20231112]。 版本修改说明20231112初版 目录 文章目录 版本说明目录字符串相乘题目解题思路代码思路补充说明参考代码 子集题目解题思路代码思路参考代码 删除链表的倒数第 N 个结点题目解题思路代码思路参考代码 字符串相乘 题目 给定两个以字符串形…...
PostgreSQL 判断JSONB数组是否包含特定的元素
文章目录 前言Integer类型的数组char类型的数组 前言 要判断一个JSONB数组是否包含特定的元素,可以使用>操作符。 Integer类型的数组 -- 是否包含数字3 SELECT [1, 2, 3, 4, 5]::jsonb > [3]::jsonb; -- true -- 是否包含数字3 SELECT [1, 2, 13, 4, 5]::js…...

idea中搭建Spring boot项目(借助Spring Initializer)
创建新项目 启动端口 在项目配置文件application.properties中写入 #启动端口server.port8088编写测试方法 创建控制类文件夹–>便于规范我们新建一个controller包–>建一个HelloWorld.class package com.example.hellospringboot.controller;import org.springframew…...
acwing算法基础之搜索与图论--染色法判断二分图
目录 1 基础知识2 模板3 工程化 1 基础知识 二分图:每条边连接的起点和终点,分别属于集合A和集合B。 一个图是二分图,当且仅当,图中不含奇数环(即,回环中的结点数目是奇数)。 染色法判定二分…...
塔式服务器是什么服务器?
在当今数字时代,数据的处理和存储需求不断增长,企业和组织需要强大而可靠的服务器来支持其业务运营和数据管理。塔式服务器作为一种常见的服务器架构,以其出色的性能、灵活性和可扩展性成为了许多企业和组织的首选。 塔式服务器的外观类似于…...
nodejs+express接口全局拦截和环境变量设置
前言: 本例中必须安装的依赖包有:express、cookie-parser(可以没有) 1. 接口全局拦截 新建一个文件intercept.ts,编写拦截过程 import express from "express"; import cookieParser from cookie-parserconst ssoRouter expre…...

深度学习之基于YoloV5的目标检测和双目测距系统
欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 双目测距系统利用两个相机的图像来计算目标到相机的距离。通过对左右相机图像进行立体匹配,可以获得目标…...

如何显示标注的纯黑mask图
文章目录 前言一、二分类mask显示二、多分类mask显示 前言 通常情况下,使用标注软件标注的标签图看起来都是纯黑的,因为mask图为单通道的灰度图,而灰度图一般要像素值大于128后,才会逐渐显白,255为白色。而标注的时候…...

【算法每日一练]-图论(保姆级教程 篇1(模板篇)) #floyed算法 #dijkstra算法 #spfa算法
今天开始讲图论 目录 图的存储 算任意两点的最短路径: floyed算法: 算一个点到其他所有点的最短距离 dijkstra算法: spfa算法: 图的存储 其实:邻接矩阵和链式向前星都能存边的信息,vector只能存点的信息,再搭配上v[]…...
c语言数据结构---十字链表
#include<stdio.h> #include<stdlib.h> typedef struct node{//十字链表 输入三元组返回矩阵 int row,col,val;struct node *down,*right; }JD,*J; typedef struct {J *rhead,*chead;int mu,nu,tu;//行列非0元 }CS; CS creat(CS M){int m,n,t;;int k,j,e;JD *p,*q…...

使用python电脑轻量级控制手机—adb命令和手机投屏
文章目录 一、通过无线连接手机和电脑二、使用adb命令轻量级控制手机二、使用scrcpy控制手机 通过电脑控制手机有多种方式如appnium等,本文介绍的是两种轻量级的方案,使用adb命令刚和手机投屏。 一、通过无线连接手机和电脑 1、手机设置 开发者选项—us…...

VBA技术资料MF82:替换文件夹中文件名中的字符
我给VBA的定义:VBA是个人小型自动化处理的有效工具。利用好了,可以大大提高自己的工作效率,而且可以提高数据的准确度。我的教程一共九套,分为初级、中级、高级三大部分。是对VBA的系统讲解,从简单的入门,到…...

如何利用大模型蒸馏出小模型实现降本
如何让小模型的推理效果在某些领域比 ChatGPT 这样的大模型还要更强?这篇论文提供了一个思路:https://arxiv.org/abs/2212.10071,借助思维链(CoT)逐步解决复杂推理任务的能力,可以使用大模型作为推理教师&a…...
CentOS 中启动 Jar 包
在 CentOS 中启动一个 Jar 包,可以通过 java 命令来实现。具体步骤如下: 确认 Java 环境已经安装并配置好了。 打开终端或者 SSH 连接到 CentOS 服务器。 执行以下命令启动 Jar 包: 复制插入 java -jar /path/to/your/jar/file.jar复制插…...

法治智能起航 | 拓世法宝AI智慧政务一体机重塑法治格局,开启智能司法新篇章
在科技的巨轮推动下,我们的社会正快速迈向一个以数据和智能为核心的新时代。在这个波澜壮阔的变革中,人工智能(AI)显得尤为突出,它不仅是科技进步的象征,更是未来发展的助力者。 2023年,最高人…...

【华为云IaaS基础三件套之----计算ECS、网络EIP、存储EVS】
MD[华为云IaaS基础三件套----计算、网络、存储] 华为云IaaS基础三件套之----计算ECS、网络EIP、存储EVS 说明: 这里只是简单从计算/网络/存储,进行介绍,阐明云上对于云下的优势;因ECS是三者综合,故最后说明。 1.网络----弹性公…...
c语言数据结构---广义表
#include<stdio.h> #include<stdlib.h> typedef struct GNode{//广义表 int NodeTag; //标志域union{ char data;struct GNode *sublist;};struct GNode *next; }*PGNode,PG; void CreateGList(PGNode &GL) {char ch;scanf("%c", …...

2023.11.12使用flask对图片进行黑白处理(base64编码方式传输)
2023.11.12使用flask对图片进行黑白处理(base64编码方式传输) 由前端输入图片并预览,在后端处理图片后返回前端显示,可以作为图片处理的模板。 关键点在于对图片进行base64编码的转化。 使用Base64编码可以更方便地将图片数据嵌入…...

MATLAB中Filter Designer的使用以及XILINX Coefficient(.coe)File的导出
文章目录 Filter Designer的打开滤波器参数设置生成matlab代码生成XILINX Coefficient(.COE) File实际浮点数的导出官方使用教程 Filter Designer的打开 打开Filter Designer: 方法一:命令行中输入Filter Designer,再回车打开。 方法二&…...
js 深度学习(四)
函数 var test function test1(){var a 1,b2console.log(a,b)test1()//递归 } console.log(test.name) //test1 test1() //报错匿名函数表达式 函数自变量 var test function(){->匿名函数var a 1,b2console.log(a,b)test1()//递归 }var test function(a,b){var a 1,b2…...

练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...

全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...
Vite中定义@软链接
在webpack中可以直接通过符号表示src路径,但是vite中默认不可以。 如何实现: vite中提供了resolve.alias:通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...

springboot 日志类切面,接口成功记录日志,失败不记录
springboot 日志类切面,接口成功记录日志,失败不记录 自定义一个注解方法 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/***…...
Leetcode33( 搜索旋转排序数组)
题目表述 整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,nums 在预先未知的某个下标 k(0 < k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...
数据库正常,但后端收不到数据原因及解决
从代码和日志来看,后端SQL查询确实返回了数据,但最终user对象却为null。这表明查询结果没有正确映射到User对象上。 在前后端分离,并且ai辅助开发的时候,很容易出现前后端变量名不一致情况,还不报错,只是单…...