汕头网页建站模板/今天新闻联播
文章目录
- 121. 小红的区间翻转
- 142. 两个字符串的最小 ASCII 删除总和
- 143. 最长同值路径
- 139.完美数
- 140. 可爱串
- 141. 好二叉树
121. 小红的区间翻转
小红拿到了两个长度为 n 的数组 a 和 b,她仅可以执行一次以下翻转操作:选择a数组中的一个区间[i, j],(i != j),将它们翻转。例如,对于 a = [2,3,4,1,5,6],小红可以选择左闭右闭区间[2,4],数组 a 则变成[2,3,5,1,4,6]。
小红希望操作后 a 数组和 b 数组完全相同。请你告诉小红有多少种操作的方案数。
初始 a 数组和 b 数组必定不相同。
输入描述
第一行输入一个正整数 n,代表数组的长度;
第二行输入 n 个正整数 ai;
第三行输入 n 个正整数 bi。
输出描述
选择区间的方案数。
输入示例
4
1 2 3 1
1 3 2 1
输出示例
2
提示信息
数据范围
1 ≤ n, ai ,bi ≤ 103
在示例中:
将 1 2 3 1 中的 2 3 进行翻转,得到 1 3 2 1。
将 1 2 3 1 整个进行翻转,得到 1 3 2 1。
所以最终结果是 2。
思路:考虑先找到满足条件的最大left索引和最小right索引,然后进行循环:每次循环left–,right++,如果说A[left]==B[right],说明翻转后还是相同,直到两者不等,那么此时就可以break了。
import java.util.*;
class Main{public static void main(String[] args){Scanner scanner = new Scanner(System.in);int len = scanner.nextInt();int[] A = new int[len], B = new int[len];for(int i = 0; i < len; i++){A[i] = scanner.nextInt();}for(int i = 0; i < len; i++){B[i] = scanner.nextInt();}System.out.println(cal(A, B, len));}private static int cal(int[] A, int[] B, int len){int start = 0, end = len - 1;//定位到A与B第一个不相同的地方,这个时候需要考虑进行翻转了while(A[start] == B[start]){start++;}while(A[end] == B[end]){end--;}//找到满足条件的最大left索引和最小right索引int left = start, right = end;while(left <= end && right >= start){if(A[left] != B[right]) return 0;left++;right--;}int res = 1;int l = start - 1, r = end + 1;//进行循环while(l >= 0 && r < len){if(A[l] != B[r]){break;}else{res++;}l--;r++;}return res;}
}
142. 两个字符串的最小 ASCII 删除总和
题目描述
给定两个字符串 s1 和 s2(0 <= s1.length, s2.length <= 1000),返回使两个字符用相等所需删除字符的 ASCLL 值的最小和。
s1 和 s2 由小写英文字母组成。
输入描述
输入共两行,每行一个字符串。
输出描述
输出一个正整数,表示使两个字符用相等所需删除字符的 ASCLL 值的最小和。
输入示例
sea
eat
输出示例
231
提示信息
解释:在“sea”中删除“s”并将"s”的值(115)加入总和。
在"eat”中删除“t“并将116 加入总和。
结束时,两个字符串相等,115+116 =231 就是符合条件的很小和。
思路:动态规划:记 d p [ i ] [ j ] dp[i][j] dp[i][j]为str1到str2最小 ASCII 删除总和,于是有转移方程
d p [ i ] [ j ] = d p [ i − 1 ] [ j − 1 ] , i f s t r 1 [ i − 1 ] = = s t r 2 [ j − 1 ] d p [ i ] [ j ] = m i n ( d p [ i − 1 ] [ j ] + s t r 1 ( i − 1 ) , d p [ i ] [ j − 1 ] + s t r 2 ( j − 1 ) ) dp[i][j]=dp[i-1][j-1],\quad if\quad str1[i-1]==str2[j-1] \\ dp[i][j] =min(dp[i-1][j]+str1(i-1),dp[i][j-1]+str2(j-1)) dp[i][j]=dp[i−1][j−1],ifstr1[i−1]==str2[j−1]dp[i][j]=min(dp[i−1][j]+str1(i−1),dp[i][j−1]+str2(j−1))
还有边界条件
d p [ 0 ] [ 0 ] = 0 d p [ i ] [ 0 ] = d p [ i − 1 ] [ 0 ] + s t r 1 ( i − 1 ) d p [ 0 ] [ j ] = d p [ 0 ] [ j − 1 ] + s t r 2 ( j − 1 ) dp[0][0]=0 dp[i][0]=dp[i-1][0]+str1(i-1)\\ dp[0][j]=dp[0][j-1]+str2(j-1) dp[0][0]=0dp[i][0]=dp[i−1][0]+str1(i−1)dp[0][j]=dp[0][j−1]+str2(j−1)
然后空间优化方面,由于 d p [ i ] [ j ] dp[i][j] dp[i][j]只与 d p [ i − 1 ] [ j ] , d p [ i ] [ j − 1 ] , d p [ i − 1 ] [ j − 1 ] dp[i-1][j],dp[i][j-1],dp[i-1][j-1] dp[i−1][j],dp[i][j−1],dp[i−1][j−1]有关,所以可以优化成一维数组。
d p [ i − 1 ] [ j ] dp[i-1][j] dp[i−1][j]就是 d p [ j ] dp[j] dp[j]
d p [ i ] [ j ] dp[i][j] dp[i][j]就是 d p [ j ] dp[j] dp[j]
d p [ i ] [ j − 1 ] dp[i][j-1] dp[i][j−1]就是 d p [ j − 1 ] dp[j-1] dp[j−1]
而 d p [ i − 1 ] [ j − 1 ] dp[i-1][j-1] dp[i−1][j−1]就需要先利用 p r e v prev prev记录 d p [ i − 1 ] [ 0 ] dp[i-1][0] dp[i−1][0],再在内层循环时用 t e m p temp temp记录 d p [ i − 1 ] [ j − 1 ] dp[i-1][j-1] dp[i−1][j−1]
import java.util.*;
class Main{public static void main (String[] args) {Scanner scanner = new Scanner(System.in);String str1 = scanner.next();String str2 = scanner.next();System.out.println(AsciiSum(str1, str2));}private static int AsciiSum(String str1, String str2){int m = str1.length();int n = str2.length();int[] dp = new int[n + 1];for(int j = 1; j <= n; j++){dp[j] = dp[j - 1] + str2.charAt(j - 1);}for(int i = 1; i <= m; i++){int prev = dp[0];dp[0] += str1.charAt(i - 1);for(int j = 1; j <= n; j++){int temp = dp[j];if(str1.charAt(i - 1) == str2.charAt(j - 1)){dp[j] = prev;}else{dp[j] = Math.min(dp[j] + str1.charAt(i-1),dp[j-1]+str2.charAt(j-1));}prev = temp;}}return dp[n];}
}
143. 最长同值路径
题目描述
给定一个二叉树的 root ,返回最长的路径的长度,这个路径中的每节点具有相同值。
这条路径可以经过也可以不经过根节点。两个节点之间的路径长度 由它们之间的边数表示。
树的节点数的范围是 [0,10^4] -1000 <= Node.val <= 1000
树的深度将不超过 18 层
输入描述
输入共两行,第一行是一个整数 n,表示第二行的字符串数。
第二行包含 n 个字符串,空格隔开,数字的字符串代表该节点存在,并且值为数字,null 代表是一个空结点。
输出描述
输出一个正整数,代表最长路径长度。
输入示例
7
5 4 5 1 1 null 5
输出示例
2
这题有两个难点,第一个自然就是找到最长路径长度,但另一个难点是如何构造需要的二叉树,所以这个问题可以拆成两个部分:
- 根据输入构建二叉树
- 根据二叉树找到最长路径长度
上面两点分别对应了deSerialize方法和dfs方法,两个方法本身并不算复杂,只不过需要熟练掌握队列的使用。
import java.util.*;
class Main{static int max;public static void main (String[] args) {max = 0;Scanner sc = new Scanner(System.in);int n = sc.nextInt();sc.nextLine();String str = sc.nextLine();TreeNode root = deSerialize(str);dfs(root);System.out.println(max);}private static int dfs(TreeNode node){if(node == null) return 0;int cur = 0, res = 0, left = dfs(node.left), right = dfs(node.right);int left1 = 0, right1 = 0;if(node.left != null && node.val == node.left.val){left1 = left + 1;}if(node.right != null && node.val == node.right.val){right1 = right + 1;}max = Math.max(max, left1 + right1);return Math.max(left1, right1);}private static TreeNode deSerialize(String s){String[] vals = s.split(" ");TreeNode root = new TreeNode(Integer.parseInt(vals[0]));Queue<TreeNode> queue = new LinkedList<>();queue.offer(root);int i = 1;while(!queue.isEmpty()){TreeNode node = queue.poll();if(i < vals.length && !vals[i].equals("null")){node.left = new TreeNode(Integer.parseInt(vals[i]));queue.offer(node.left);}i++;if(i < vals.length && !vals[i].equals("null")){node.right = new TreeNode(Integer.parseInt(vals[i]));queue.offer(node.right);}i++;}return root;}
}
class TreeNode{TreeNode left;TreeNode right;int val;TreeNode(){}TreeNode(int val){this.val = val;}
}
139.完美数
题目描述
小红定义一个数为“完美数”,当且仅当该数仅有一个非零数字。例如 5000, 4, 1, 10, 200 都是完美数。 小红拿到了一个大小为 n(2 <= n <= 2000)的数组 a,她希望选择数组中的两个元素(1 <= a[i] <= 10^9),满足它们的乘积为完美数。 小红想知道,共有多少种不同的取法?
输入描述
第一行输入一个整数 n,表示数组大小。 第二行输入 n 个整数,整数之间用空格隔开,表示数组中的元素。
输出描述
输出一个整数,表示取法个数。
输入示例
4
25 2 1 16
输出示例
3
提示信息
25 * 2 = 50; 2 * 1 = 2; 25 * 16 = 400。
难度不大,将long来存储乘积结果并用String来进行0
的判断是关键。
import java.util.*;
class Main{public static void main (String[] args) {Scanner sc = new Scanner(System.in);int res = 0;int n = sc.nextInt();long[] nums = new long[n];for(int i = 0; i < n; i++){nums[i] = sc.nextInt();}for(int i = 0; i < n; i++){for(int j = i + 1; j < n; j++){long ans = nums[i] * nums[j];if(isValid(ans)) res++;}}System.out.println(res);}private static boolean isValid(long ans){String s = String.valueOf(ans);for(int i = 1; i < s.length(); i++){if(s.charAt(i) != '0'){return false;}}return true;}
}
140. 可爱串
题目描述
我们定义子序列为字符串中可以不连续的一段,而子串则必须连续。
例如 rderd 包含子序列 "red”,且不包含子串"red”,因此该字符串为可爱串。 小红想知道,长度为 n(3 <= n <= 10 ^ 5)的、仅由 'r''e''d' 三种字母组成的字符串中,有多少是可爱串?答案请对 10 ^ 9 + 7 取模。
输入描述
输入共一行,包含一个正整数 n
输出描述
输出一个正整数,代表可爱串的数量
输入示例
4
输出示例
3
提示信息
"reed"、"rerd"、"rded"
import java.util.*;public class Main{static long MOD = (long) (1e9 + 7);public static void main(String[] args) {Scanner in = new Scanner(System.in);int n = in.nextInt();long[] dp1 = new long[n + 1];long[] dp2 = new long[n + 1];long[] dp3 = new long[n + 1];// 可爱串的个数 = 包含“red”子序列的方案个数 - 包含“red”子串的方案个数// dp1[i]表示长度为i的包含“red”子串的方案个数for (int i = 3; i <= n; i++) {dp1[i] = (3 * dp1[i - 1] + pow(3,i - 3) - dp1[i - 3] + MOD) % MOD;}// dp2[i]表示长度为i的包含“re”子序列的方案个数for (int i = 2; i <= n; i++) {dp2[i] = ((2 * dp2[i - 1]) + (i - 1) * pow(2, i - 2) + MOD) % MOD;}// dp3[i]表示长度为i的包含“red”子序列的方案个数for (int i = 3; i <= n; i++) {dp3[i] = (3 * dp3[i - 1] + dp2[i - 1] + MOD) % MOD;}System.out.println(dp3[n] - dp1[n]);}private static long pow(long x, long n) {long res = 1;while (n > 0) {if ((n & 1) == 1) { // 如果 n 是奇数res = res * x % MOD;}x = x * x % MOD;n >>= 1; // n 右移一位,相当于除以 2}return res;}
}
141. 好二叉树
题目描述
小红定义一个二叉树为“好二叉树”,当且仅当该二叉树所有节点的孩子数量为偶数(0 或者 2)。
小红想知道,n(1<= n <=3000)个节点组成的好二叉树,共有多少种不同的形态?
答案请对 10 ^ 9 + 7 取模。
输入描述
输入一个正整数 n
输出描述
输出一个正整数,代表好二叉树的数量
输入示例
5
输出示例
2
思路:动态规划,一个二叉树除了根节点可以分为左子树和右子树,设分别有 j j j个和 k − j k-j k−j个,其中 k = i − 1 k=i-1 k=i−1, j j j遍历每一个奇数即可。
import java.util.*;
class Main{static long MOD = (long)(1e9 + 7);public static void main (String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();long[] dp = new long[3001];dp[1] = dp[3] = 1;for(int i = 5; i <= n; i += 2){for(int j = 1, k = i - 1; j < k; j += 2){dp[i] += (dp[j] * dp[k-j]) % MOD;dp[i] %= MOD;}}System.out.println(dp[n]);}
}
相关文章:

算法题目整合
文章目录 121. 小红的区间翻转142. 两个字符串的最小 ASCII 删除总和143. 最长同值路径139.完美数140. 可爱串141. 好二叉树 121. 小红的区间翻转 小红拿到了两个长度为 n 的数组 a 和 b,她仅可以执行一次以下翻转操作:选择a数组中的一个区间[i, j]&…...

万界星空科技AI低代码平台:重塑数字化创新边界
在这个日新月异的数字化时代,技术的飞速发展正以前所未有的力量重塑着每一个行业。企业如何在瞬息万变的市场环境中保持竞争力,实现业务的快速迭代与创新? 重塑开发模式,加速数字化转型 传统软件开发周期长、成本高、门槛高&…...

iredmail服务器安装步骤详解!如何做配置?
iredmail服务器安全性设置指南?怎么升级邮件服务器? iredmail是一个功能强大的邮件服务器解决方案,它集成了多个开源软件,使您能够快速部署和管理邮件服务。AokSend将逐步引导您完成安装过程,无需深入的编程知识即可轻…...

【vue深入学习第1章】Vue.js 中的 Ajax 处理:vue-resource 库的深度解析
在现代前端开发中,Ajax 请求是与后端进行数据交互的关键技术。Vue.js 作为一个渐进式 JavaScript 框架,提供了多种方式来处理 Ajax 请求,其中 vue-resource 是一个较为常用的库。尽管 vue-resource 在 Vue 2.x 之后不再是官方推荐的 Ajax 处理…...

JDK新特性(Lambda表达式,Stream流)
Lambda表达式: Lambda 表达式背后的思想是函数式编程(Functional Programming)思想。在传统的面向对象编程中,程序主要由对象和对象之间的交互(方法调用)构成;而在函数式编程中,重点…...

【ARM】MDK-服务器与客户端不同网段内出现卡顿问题
【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 记录不同网段之间的请求发送情况以及MDK网络版license文件内设置的影响。 2、 问题场景 客户使用很久的MDK网络版,在获取授权时都会出现4-7秒的卡顿,无法对keil进行任何操作,彻底…...

c++树(一)定义,遍历
目录 树的定义 树的基本术语 树的初始起点:我们定义为根 树的层次: 树的定义: 树的性质 性质1: 性质2: 树形结构存储的两种思路 树的遍历模板 树上信息统计方式1-自顶向下统计 树上信息统计方式2-自底向上统…...

YOLOv5和LPRNet的车牌识别系统
车牌识别系统 YOLOv5和LPRNet的车牌识别系统结合了深度学习技术的先进车牌识别解决方案。该系统整合了YOLOv5目标检测框架和LPRNet文本识别模型 1. YOLOv5目标检测框架 YOLO是一种先进的目标检测算法,以其实时性能和高精度闻名。YOLOv5是在前几代基础上进行优化的…...

内容安全(深度行为检测技术、IPS、AV、入侵检测方法)
1、深度行为检测技术 深度行为检测技术:是一种基于深度学习和机器学习的技术,它通过分析用户在网络中的行为模式,识别异常或潜在威胁行为,从而保护网络安全和内容安全 分类: 深度包检测技术(Deep Packet…...

MySQL双主双从实现方式
双主双从(MM-SS) 前言 避免单一主服务器宕机,集群写入能力缺失 从 1 复制 主1 ,从 2 复制 主 2 主 1 复制 主 2,主 2 复制主 1 也就是 主 1 和主 2 互为主从。主1主2互为主从, 是为了以下情景,…...

pico+unity手柄和摄像机控制初级设置
1、摄像头配置 摄像头模式、floor是追踪原点类型(将根据设备检测到地面的高度来计算追踪原点), Device 模式时,为通常理解的 Eye 模式,不会将根据设备检测到地面的高度来计算追踪原点 选择floor时,修改相…...

vxe-grid 实现配置式form搜索条件 form搜索条件框可折叠 配置式table
文章目录 效果图代码 效果图 代码 <template><div class"app-container"><vxe-grid refxGrid v-bind"gridOptions" v-if"tableHeight" :height"tableHeight"><template #billDate"{ data }"><e…...

TS相较于JS有什么优缺点
TypeScript(TS)是JavaScript的一个超集,它添加了静态类型检查和编译时的强大功能,目的是提高代码质量和维护性。相较于JavaScript,TS的主要优点和缺点如下: 优点: 类型安全性:通过…...

【Harmony】SCU暑期实训鸿蒙开发学习日记Day2
目录 Git 参考文章 常用操作 ArkTS的网络编程 Http编程 发送请求 GET POST 处理响应 JSON数据解析 处理响应头 错误处理 Web组件 用生命周期钩子实现登录验证功能 思路 代码示例 解读 纯记录学习日记,杂乱,误点的师傅可以掉了…...

vue3前端开发-执行npm run dev提示报错怎么解决
vue3前端开发-执行npm run dev提示报错怎么解决!今天在本地安装初始化了一个vue3的案例demo。但是当我执行npm run dev想启动它时报错了说,找不到dev。让我检查package.json文件是否包含dev。如下图所示: 实际上,不必惊慌…...

https 单向认证和双向认证
单向认证 单向认证是客户端(通常是浏览器)验证服务器的身份。服务器向客户端提供数字证书,客户端通过验证该证书的真实性来确认与服务器的连接是安全的。 服务器提供证书:服务器向客户端提供一个数字证书,用于验证服务器的身份。客户端验证服务器:客户端验证服务器的证书…...

Python中Selenium 和 keyboard 库的使用
文章目录 一、Selenium基本使用2.等待元素加载常用操作 keyboard基本使用与 Selenium 联合使用 一、Selenium Selenium 是一个用于浏览器自动化的工具。它可以模拟用户与网页的交互,如点击按钮、填写表单、导航页面等。Selenium 支持多种编程语言,包括 …...

网络安全协议系列
目录 一、安全协议的引入 1.TCP/IP协议族中普通协议的安全缺陷 1.信息泄露 2.信息篡改 3.身份伪装 4.行为否认 2.网络安全需求 二、网络安全协议的定义 三、构建网络安全协议所需的组件 1.加密与解密 2.消息摘要 3.消息验证码 4.数字签名 5.密钥管理 1.建立共享…...

.net core appsettings.json 配置 http 无法访问
1、在appsettings.json中配置"urls": "http://0.0.0.0:8188" 2、但是网页无法打开 3、解决办法,在Program.cs增加下列语句 app.UseAntiforgery();...

opencv—常用函数学习_“干货“_11
目录 二九、图像累加 将输入图像累加到累加图像中 (accumulate) 将输入图像加权累加到累加图像中 (accumulateWeighted) 将输入图像的平方累加到累加图像中 (accumulateSquare) 将两个输入图像的乘积累加到累加图像中 (accumulateProduct) 解释 三十、随机数与添加噪声 …...

WSL-Ubuntu20.04部署环境配置
1.更换Ubuntu软件仓库镜像源 为了在WSL上使用TensorRT进行推理加速,需要安装以下环境,下面将按以下顺序分别介绍安装、验证以及删除环境: #1.C环境配置 gcc、gdb、g #2.gpu环境 cuda、cudnn #3.Cmake环境 CMake #4.OpenCV环境 OpenCV #5.Ten…...

6Python的Pandas:数据读取与输出
Pandas是一个强大的Python数据分析库,提供了读取和输出数据的多种功能。以下是一些常见的数据读取与输出方法: 1. 读取CSV 读取数据 从CSV文件读取数据 import pandas as pd# 读取CSV文件 df pd.read_csv(file_path.csv) print(df.head())从Excel文…...

ubuntu 网络 通讯学习笔记2
1.ubuntu 网络常用命令 在Ubuntu中,有许多网络相关的常用命令。以下是一些主要命令及其用途: ifconfig:此命令用于显示和配置网络接口信息。你可以使用它来查看IP地址、子网掩码、广播地址等。 例如:ifconfig 注意:…...

深入理解JS中的事件委托
JavaScript中的事件委托是一种非常有用的事件处理模式,它允许我们利用事件模型的事件冒泡阶段来减少事件处理器的数量,提高网页性能。本文将介绍事件委托的概念、工作原理、优点以及如何在实际项目中应用事件委托。 1、事件模型 事件模型指在Web开发中,处理和管理事件(如…...

Camera Raw:首选项
Camera Raw 首选项 Preferences提供了丰富的配置选项,通过合理设置,可以显著提升图像处理的效率和效果。根据个人需求调整这些选项,有助于创建理想的工作环境和输出质量。 ◆ ◆ ◆ 打开 Camera Raw 首选项 方法一:在 Adobe Bri…...

HLS加密技术:保障流媒体内容安全的利器
随着网络视频内容的爆炸性增长,如何有效保护视频内容的版权和安全成为了一个亟待解决的问题。HLS(HTTP Live Streaming)加密技术作为一种先进的流媒体加密手段,凭借其高效性和安全性,在直播、点播等场景中得到了广泛应…...

捷配总结的SMT工厂安全防静电规则
SMT工厂须熟记的安全防静电规则! 安全对于我们非常重要,特别是我们这种SMT加工厂,通常我们所讲的安全是指人身安全。 但这里我们须树立一个较为全面的安全常识就是在强调人身安全的同时亦必须注意设备、产品的安全。 电气: 怎样预…...

UE4-初见虚幻引擎
一.创建自己的工程 1.启动 a.通过桌面双击图标来打开对应版本的虚幻引擎 b.通过EPIC启动器开启动虚幻引擎 2.选择或新建项目 ps:高版本虚幻编辑器可以打开低版本的虚幻项目,但是高版本虚幻的项目不可以由低版本的虚幻编辑器打开。 3. 选择要打开的项目 4.选择模版 选…...

基于Vue CLI 3构建Vue3项目(Vue2也可参考)
天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…...

Midjourney 绘画提示词汇总:让你的 AI 绘画与众不同
在 AI 技术迅速发展的今天,AI 绘画已经成为了创意工作中的一大利器。Midjourney 作为其中的佼佼者,以其强大的绘画能力和高质量的输出受到了广大用户的喜爱。为了帮助你充分发挥 Midjourney 的潜力,我们整理了一些能够让 AI 绘画与众不同的提…...