算法题目整合

文章目录

  • 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[i1][j1],ifstr1[i1]==str2[j1]dp[i][j]=min(dp[i1][j]+str1(i1),dp[i][j1]+str2(j1))
还有边界条件
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[i1][0]+str1(i1)dp[0][j]=dp[0][j1]+str2(j1)
然后空间优化方面,由于 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[i1][j]dp[i][j1]dp[i1][j1]有关,所以可以优化成一维数组。
d p [ i − 1 ] [ j ] dp[i-1][j] dp[i1][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][j1]就是 d p [ j − 1 ] dp[j-1] dp[j1]
d p [ i − 1 ] [ j − 1 ] dp[i-1][j-1] dp[i1][j1]就需要先利用 p r e v prev prev记录 d p [ i − 1 ] [ 0 ] dp[i-1][0] dp[i1][0],再在内层循环时用 t e m p temp temp记录 d p [ i − 1 ] [ j − 1 ] dp[i-1][j-1] dp[i1][j1]

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

在这里插入图片描述这题有两个难点,第一个自然就是找到最长路径长度,但另一个难点是如何构造需要的二叉树,所以这个问题可以拆成两个部分:

  1. 根据输入构建二叉树
  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 kj个,其中 k = i − 1 k=i-1 k=i1 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]);}
}

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

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

相关文章

【Neural signal processing and analysis zero to hero】- 2

Nonstationarities and effects of the FT course from youtube: 传送地址 why we need extinguish stationary and non-stationary signal, because most of neural signal is non-stationary. Welch’s method for smooth spectral decomposition Full FFT method y…

用Docker来开发

未完成。。。 现在好像用Docker是越来越多了。之前其实也看过docker的原理&#xff0c;大概就是cgroup那些&#xff0c;不过现在就不看原理了&#xff0c;不谈理论&#xff0c;只看实际中怎么用&#xff0c;解决眼前问题。 用docker来做开发&#xff0c;其实就是解决的编译环境…

ArkUI-动画

属性动画 属性动画是通过设置组建的animation属性来给组件添加动画&#xff0c;当组件的width、height、Opacity、backgroundColor、scale、rotate、translate等属性变更时&#xff0c;可以实现渐变过渡效果 Text().position({x: 10, //x轴坐标y: 0 //y轴坐标}).rotate…

在 PostgreSQL 里如何处理数据的存储优化和查询优化的优先级权衡?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01;&#x1f4da;领书&#xff1a;PostgreSQL 入门到精通.pdf 文章目录 在 PostgreSQL 里如何处理数据的存储优化和查询优化的优先级权衡一、存储优化与查询优化的概述&#x…

阿里:深入探讨Java的分层编译

本文主要探讨Java虚拟机&#xff08;JVM&#xff09;中的分层编译&#xff08;Tiered Compilation&#xff09;机制及其对程序性能的影响。 前言 一开始接触到分层编译是因为我们这的服务每次发布/重启后都会短暂地出现CPU满线程池满的情况&#xff0c;然后过一段时间又能自动…

学习008-01-03 Customize the Application UI and Behavior(自定义应用程序UI和行为)

Customize the Application UI and Behavior&#xff08;自定义应用程序UI和行为&#xff09; In XAF, the data model defines the database structure and UI. Changes to your entity classes affect the UI. For example, if you add a new property to an entity class, …

C++ | Leetcode C++题解之第239题滑动窗口最大值

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<int> maxSlidingWindow(vector<int>& nums, int k) {int n nums.size();vector<int> prefixMax(n), suffixMax(n);for (int i 0; i < n; i) {if (i % k 0) {prefixMax[i] num…

MySQL(7)内外连接+索引

目录 1.内外连接; 2. 索引; 1.内外连接: 1.1内连接: 语法: select 字段 from 表名 inner join 表名 on 字段限制; 1.2 外连接: 分为左右外连接; (1)左外连接: 语法: select * from 表名 left join 表名 on 字段限制. &#x1f330;查询所有学生的成绩&#xff0c;如果这个学生…

MySQL(8)事务

目录 1.事务; 1.事务: 1.1 如果CURD不加限制会这么样子? 可能造成数据同时被修改, 数据修改的结果是未知的.(可以想一下之前的抢票线程问题) 1.2 事务概念: 事务就是一组DML语句组成&#xff0c;这些语句在逻辑上存在相关性&#xff0c;这一组DML语句要么全部成功&#xff0…

【Python实战因果推断】40_双重差分11

目录 Heterogeneous Effect over Time Heterogeneous Effect over Time 有好消息也有坏消息。首先是好消息&#xff1a;你已经发现了问题所在。也就是说&#xff0c;你知道 TWFE 在应用于具有时间异构效应的交错采用数据时是有偏差的。用更专业的术语来说&#xff0c;您的数据…

TDesign组件库日常应用的一些注意事项

【前言】Element&#xff08;饿了么开源组件库&#xff09;在国内使用的普及率和覆盖率高于TDesign-vue&#xff08;腾讯开源组件库&#xff09;&#xff0c;这也导致日常开发遇到组件使用上的疑惑时&#xff0c;网上几乎搜索不到其文章解决方案&#xff0c;只能深挖官方文档或…

大厂面试官问我:Redis为什么使用哈希槽的方式进行数据分片?为什么不适用一致性哈希的方式?【后端八股文十三:Redis 集群哈希八股文合集(1)】

本文为【Redis 集群哈希 八股文合集&#xff08;1&#xff09;】初版&#xff0c;后续还会进行优化更新&#xff0c;欢迎大家关注交流~ hello hello~ &#xff0c;这里是绝命Coding——老白~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注…

pdf怎么转换成图片?3种PDF转图片方法分享

pdf怎么转换成图片&#xff1f;将PDF转换成图片不仅满足了快速分享的需求&#xff0c;还便于在多种平台上展示。特别是在社交媒体、演示文稿或在线文档中&#xff0c;图片格式的PDF页面更加直观易用。此外&#xff0c;转换成图片后&#xff0c;我们还可以利用图片编辑工具对PDF…

【Linux】启动的秘密花园:深入GRUB、Init系统和Systemd

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Linux &#xff1a;从菜鸟到飞鸟的逆袭》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、Linux的起源与发展 2、Linux的特点 3、Linux启…

Java中的迭代器(Iterator)

Java中的迭代器&#xff08;Iterator&#xff09; 1、 迭代器的基本方法2、 迭代器的使用示例3、注意事项4、克隆与序列化5、结论 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Java中&#xff0c;迭代器&#xff08;Iterator&#xff0…

隐性行为克隆——机器人的复杂行为模仿学习的新表述

介绍 论文地址&#xff1a;https://arxiv.org/pdf/2109.00137.pdf 源码地址&#xff1a;https://github.com/opendilab/DI-engine.git 近年来&#xff0c;人们对机器人学习进行了大量研究&#xff0c;并取得了许多成果。其中&#xff0c;模仿学习法尤其受到关注。这是一种从人…

无线通信 | 发射系统架构:两次变频发射机和直接变频发射机

微信公众号上线,搜索公众号小灰灰的FPGA,关注可获取相关源码,定期更新有关FPGA的项目以及开源项目源码,包括但不限于各类检测芯片驱动、低速接口驱动、高速接口驱动、数据信号处理、图像处理以及AXI总线等 本节目录 一、发射系统架构 1、两次变频发射机 2、直接变频发射机…

微信小程序 vant-weapp的 SwipeCell 滑动单元格 van-swipe-cell 滑动单元格不显示 和 样式问题 滑动后删除样式不显示

在微信小程序开发过程中 遇到个坑 此处引用 swipeCell 组件 刚开始是组件不显示 然后又遇到样式不生效 首先排除问题 是否在.json文件中引入了组件 {"usingComponents": {"van-swipe-cell": "vant/weapp/swipe-cell/index","van-cell-gro…

图新地球-如何快速绘制各种形状的箭头(一分钟小视频演示)

0.序 随着近几年测绘成果的完善&#xff0c;很多检察院、规划院、自然资源局等政府与事业单位&#xff0c;日常的应用也都不在仅仅局限于原来的卫星影像底图了&#xff0c;很多院都应用上了无人机航测高分辨率影像以及倾斜模型。 可能经常需要再道路中央标注汽车行驶方向、掉头…

AQS源码解析(ReentrantLock)

什么是AQS:Juc中的大多数同步器都是围绕着一些相同的基础行为&#xff0c;比如等待队列&#xff0c;条件队列&#xff0c;共享&#xff0c;独占获取变量这些行为&#xff0c;抽象出来就是基于AQS&#xff08;AbstractQueuedSynchronizer&#xff09;实现的。所以可以把AQS看成这…