算法题目整合4

文章目录

  • 122. 大数减法
  • 123. 滑动窗口最大值
  • 117. 软件构建
  • 124. 小红的数组构造
  • 125. 精华帖子
  • 126. 连续子数组最大和

122. 大数减法

题目描述

以字符串的形式读入两个数字,编写一个函数计算它们的差,以字符串形式返回。

输入描述

输入两个数字(都为正数)

输出描述

两个输入数字的差

输入示例

1 2

输出示例

-1

提示信息

输入的数据可能会超出一般长整数的范围。

模拟。

import java.util.*;
class Main{public static void main (String[] args) {Scanner sc = new Scanner(System.in);String s = sc.nextLine();String[] nums = s.split(" ");String num1 = nums[0], num2 = nums[1];int num1Length = num1.length(), num2Length = num2.length();if(num1Length > num2Length){System.out.println(compute(num1, num2));}else if(num1Length < num2Length){System.out.println("-" + compute(num2, num1));}else{for(int i = 0; i < num1Length; i++){int a = num1.charAt(i) - '0';int b = num2.charAt(i) - '0';if(a > b){System.out.println(compute(num1, num2));break;}else if(a < b){System.out.println("-" + compute(num2, num1));break;}else if(i == num1Length - 1){System.out.println("0");}}}}public static String compute(String num1, String num2){StringBuilder sb = new StringBuilder();int num1Length = num1.length(), num2Length = num2.length();int indexOfNum1 = num1Length - 1, indexOfNum2 = num2Length - 1;int mod = 0;for(; indexOfNum1 >= 0 && indexOfNum2 >= 0; indexOfNum1--, indexOfNum2--){int n1 = num1.charAt(indexOfNum1) - '0';int n2 = num2.charAt(indexOfNum2) - '0';int ans = n1 + mod >= n2 ? n1 + mod - n2 : 10 + n1 + mod - n2;mod = n1 + mod >= n2 ? 0 : -1;sb.append(ans);}while(indexOfNum1 >= 0){int n1 = num1.charAt(indexOfNum1) - '0';int ans = n1 + mod >= 0 ? n1 + mod : 10 + n1 + mod;mod = n1 + mod >= 0 ? 0 : -1;sb.append(ans);indexOfNum1--;}String res = sb.reverse().toString();int right = 0;while(right < res.length()){if(res.charAt(right) == '0'){right++;}else{break;}}return res.substring(right);}
}

如果是笔试,可以直接利用java.math.BigInteger快速求解:

import java.util.*;
import java.math.*;
class Main{public static void main(String[] arg){Scanner sc = new Scanner(System.in);String[] nums = sc.nextLine().split(" ");System.out.println(new BigInteger(nums[0]).add(new BigInteger("-" + nums[1])));}
}

123. 滑动窗口最大值

题目描述

给定一个整数数组 nums 和一个整数 k,k 表示滑动窗口的大小。
你需要找出每个滑动窗口中的最大值与最小值的差,并返回这些差的最大值。

输入描述

数组的长度为 n,1 <= n <= 10000,数组中的每个元素范围为[-10000,10000],
滑动窗口大小k的范围为[1,n]。

输出描述

例如,给定一个字符串 "nums = [1,3,-1,-3,5,3,6,7], k = 3",表示一个数组和窗口大小 k。
对于该数组中的每个窗口,计算最大值与最小值的差,并返回这些差值中的最大值。 
在这个例子中,每个窗口的最大值与最小值的差分别为 [4, 6, 8, 8, 3, 4],因此最终返回的结果是 8。

输入示例

nums = [1,3,-1,-3,5,3,6,7], k = 3

输出示例

8

提示信息

题目输入是一个字符串,需要自己解析为数组和 k 值。

leetcode239题变形,采用两个PriorityQueue即可,注意数据的读取。

import java.util.*;
class Main{public static void main(String[] args) {Scanner sc = new Scanner(System.in);String str = sc.nextLine();String numsStr = str.substring(str.indexOf("[") + 1, str.indexOf("]"));String[] numsArr = numsStr.split(",");int[] nums = new int[numsArr.length];for (int i = 0; i < numsArr.length; i++) {nums[i] = Integer.parseInt(numsArr[i].trim());}int k = Integer.parseInt(str.substring(str.lastIndexOf("=") + 1).trim());System.out.println(maxSlidingWindow(nums, k));}public static int maxSlidingWindow(int[] nums, int k){PriorityQueue<int[]> maxQueue = new PriorityQueue<>(new Comparator<int[]>(){public int compare(int[] pair1, int[] pair2){return pair1[0] != pair2[0] ? pair2[0] - pair1[0] : pair2[1] - pair1[1];}});PriorityQueue<int[]> minQueue = new PriorityQueue<>(new Comparator<int[]>(){public int compare(int[] pair1, int[] pair2){return pair1[0] != pair2[0] ? pair1[0] - pair2[0] : pair1[1] - pair2[1];}});int n = nums.length;for(int i = 0; i < k; i++){maxQueue.offer(new int[]{nums[i], i});minQueue.offer(new int[]{nums[i], i});}int res = maxQueue.peek()[0] - minQueue.peek()[0];for(int i = k; i < n; i++){maxQueue.offer(new int[]{nums[i], i});minQueue.offer(new int[]{nums[i], i});while(maxQueue.peek()[1] <= i - k){maxQueue.poll();}while(minQueue.peek()[1] <= i - k){minQueue.poll();}res = Math.max(res, maxQueue.peek()[0] - minQueue.peek()[0]);}return res;}
}

117. 软件构建

题目描述

某个大型软件项目的构建系统拥有 N 个文件,文件编号从 0 到 N - 1,
在这些文件中,某些文件依赖于其他文件的内容,这意味着如果文件 A 依赖于文件 B,
则必须在处理文件 A 之前处理文件 B (0 <= A, B <= N - 1)。
请编写一个算法,用于确定文件处理的顺序。

输入描述

第一行输入两个正整数 N, M。表示 N 个文件之间拥有 M 条依赖关系。	
后续 M 行,每行两个正整数 S 和 T,表示 T 文件依赖于 S 文件。

输出描述

输出共一行,如果能处理成功,则输出文件顺序,用空格隔开。 
如果不能成功处理(相互依赖),则输出 -1。

输入示例

5 4
0 1
0 2
1 3
2 4

输出示例

0 1 2 3 4

提示信息

文件依赖关系如下:

在这里插入图片描述

所以,文件处理的顺序除了示例中的顺序,还存在
0 2 4 1 3
0 2 1 3 4等等合法的顺序。

数据范围:

0 <= N <= 10 ^ 5	
1 <= M <= 10 ^ 9
每行末尾无空格。

思路:就是leetcode210:课程表II的原题,换了个名词而已,直接bfs拓扑排序。

import java.util.*;
class Main{public static void main (String[] args) {Scanner sc = new Scanner(System.in);int numOfFiles = sc.nextInt();int connections = sc.nextInt();List<Integer>[] arr = new List[numOfFiles];for (int i = 0; i < numOfFiles; i++){arr[i] = new ArrayList<>();}int[] indegree = new int[numOfFiles];for(int i = 0; i < connections; i++){int a = sc.nextInt();int b = sc.nextInt();arr[a].add(b);indegree[b]++;}int index = 0;int[] res = new int[numOfFiles];Deque<Integer> queue = new LinkedList<>();for(int i = 0; i < numOfFiles; i++){if(indegree[i] == 0){queue.offer(i);}}while(!queue.isEmpty()){int fileRoot = queue.poll();res[index++] = fileRoot;for(int file : arr[fileRoot]){indegree[file]--;if(indegree[file] ==0){queue.offer(file);}}}if(index == numOfFiles){for(int i = 0; i < numOfFiles; i++){if(i != numOfFiles - 1){System.out.print(res[i] + " ");}else{System.out.print(res[i]);}}}else{System.out.println("-1");}}
}

124. 小红的数组构造

题目描述

小红的数组构造小红希望你构造一个数组满足以下条件: 
1. 数组共有 n 个元素,且所有元素两两不相等。 
2. 所有元素的最大公约数等于 k。 
3. 所有元素之和尽可能小。请你输出数组元素之和的最小值。

输入描述

两个正整数 n 和 k。

输出描述

一个正整数,代表数组元素之和的最小值。

输入示例

3 1

输出示例

6

提示信息

数据范围: 1≤ n,k ≤ 10^5

思路:最大公约数为 k k k,那就是说这些数是 k , 2 k , 3 k , ⋯ , n k k,2k,3k,\cdots, nk k,2k,3k,,nk,直接等差数列求和得到答案,注意要用long类型,不要越界。

import java.util.*;
class Main{public static void main (String[] args) {Scanner sc = new Scanner(System.in);long n = sc.nextInt();long k = sc.nextInt();System.out.println((k*n*(n+1)/2));}
}

125. 精华帖子

题目描述

小红书的推荐帖子列表为 [0 ,n),其中所有的帖子初始状态为 “普通”,现在运营同学把其中的一些帖子区间标记为了 “精华”。 
运营同学选择了固定长度 k,对整个帖子列表截取,要求计算在固定的截取长度 k 下,能够截取获得的最多精华帖子数量。

输入描述

第一行输入三个正整数 n,m,k,分别代表初始帖子列表长度,精华区间的数量,以及运营同学准备截取的长度。
接下来的 m 行,每行输入两个正整数,li 和 ri  ,代表第 i 个左闭右开区间。
1 <= k <= n <= 20000000.
1 <= m <= 100000.
0 <= li < ri <= n,保证任意两个区间是不重复的。

输出描述

一个正整数,代表截取获得的最多的精华帖子数量。

输入示例

5 2 3
1 2
3 5

输出示例

2

提示信息

这是一个长度为 5 的帖子列表,如果用 0 表示普通帖子,1 表示精华帖子,则该列表为 [0, 1, 0, 1, 1],用长度 k = 3 的区间截取列表,最多能够包含两个精华帖子。

思路:可以用滑动窗口进行解决,空间会比较紧张。

import java.util.*;
class Main{public static void main (String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt(), m = sc.nextInt(), k = sc.nextInt();int[][] intervals = new int[m][2];for(int i = 0; i < m; i++){intervals[i][0] = sc.nextInt();intervals[i][1] = sc.nextInt();}Arrays.sort(intervals, (interval1, interval2) -> interval1[0] - interval2[0]);int res = 0, sum = 0;int left = 0, right = 0;while(right < m){sum += intervals[right][1] - intervals[right][0];while(intervals[right][1] - intervals[left][1] >= k){//当左边区间不被滑动窗口包含时sum -= intervals[left][1] - intervals[left][0];left++;}if(intervals[right][1] - intervals[left][0] > k){//左边区间只有部分被滑动窗口包围res = Math.max(res, sum - (intervals[right][1] - k - intervals[left][0]));}else{res = Math.max(res, sum);}right++;}System.out.println(res);}
}

126. 连续子数组最大和

题目描述

小红拿到了一个数组,她希望进行最多一次操作:将一个元素修改为x。小红想知道,最终的连续子数组最大和最大是多少?

输入描述

第一行输入一个正整数t,代表询问次数。 
对于每次询问,输入两行:
第一行输入两个正整数n和x。代表数组的大小,以及小红可以修改成的元素。 
第二行输入n个正整数a_i,代表小红拿到的数组

输出描述

输出 t 行,每行输出一个整数,代表连续子数组的最大和。

输入示例

3
5 10
5 -1 -5 -3 2
2 -3
-5 -2
6 10
4 -2 -11 -1 4 -1

输出示例

15
-2
15

提示信息

例如输入:
6 10
4 -2 -11 -1 4 -1
可以用10 替换 -11,连续子数组的最大和:4 -2 10 -1 4,总和为:15

数据范围:

1 ≤ t ≤ 100000 
1 ≤ n ≤ 200000 
-10^9 ≤ x ,a_i  ≤ 10^9 
每组所有询问的n的和不超过200000。

由于最多只能改变一次值,所以我们可以用一个replacePre变量记录改变后的最大值。
思路:动态规划, p r e i pre_i prei记录的是不考虑替换的以第 i 个数结尾的「连续子数组的最大和」,所以:
p r e i = m a x { p r e i − 1 + n u m s i , n u m s i } pre_i=max\{pre_{i-1}+nums_i,nums_i\} prei=max{prei1+numsi,numsi}
如果没有替换这个条件就可以直接res = max{res, pre}了,所以接下来还需要考虑替换的情况,那就是令 r e p l a c e P r e replacePre replacePre表示考虑替换的以第 i 个数结尾的「连续子数组的最大和」,所以:
r e p l a c e P r e i = m a x { r e p l a c e N u m b e r , p r e i − 1 + r e p l a c e N u m b e r , r e p l a c e P r e i − 1 + n u m s i } replacePre_i=max\{replaceNumber,pre_{i-1}+replaceNumber,replacePre_{i-1}+nums_i\} replacePrei=max{replaceNumber,prei1+replaceNumber,replacePrei1+numsi}
第一个元素表示直接拿替换的数字作为起点,重新开始记录;
第二个元素表示未替换过的最大值加上需要替换的数字;
第三个元素表示替换过的最大值加上正常的数字。
三个元素都保证了replacePre这个变量记录的是替换后的「连续子数组的最大和」。至于没有替换的情况,那就是上面 p r e pre pre考虑的情况了。

import java.util.*;
class Main{public static void main (String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();while(n > 0){int len = sc.nextInt();int replace = sc.nextInt();int[] nums = new int[len];for (int i = 0; i < len; i++){nums[i] = sc.nextInt();} int pre = 0, replacePre = pre, res = nums[0];for(int num : nums){replacePre = Math.max(replace, Math.max(replace + pre, replacePre + num));pre = Math.max(num, num + pre);res = Math.max(res, Math.max(pre, replacePre));}System.out.println(res);n--;}}
}

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

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

相关文章

物联网专业创新人才培养体系的探索与实践

一、引言 随着物联网&#xff08;IoT&#xff09;技术的迅猛发展&#xff0c;物联网领域的人才需求日益增加。物联网技术作为新一轮信息技术革命的核心&#xff0c;已经渗透到社会生活的各个领域&#xff0c;对推动经济转型升级、提升国家竞争力具有重要意义。因此&#xff0c…

VUE之---slot插槽

什么是插槽 slot 【插槽】&#xff0c; 是 Vue 的内容分发机制&#xff0c; 组件内部的模板引擎使用slot 元素作为承载分发内容的出口。slot 是子组件的一个模板标签元素&#xff0c; 而这一个标签元素是否显示&#xff0c; 以及怎么显示是由父组件决定的。 VUE中slot【插槽】…

自己开发软件实现网站抓取m3u8链接

几天前一个同学说想下载一个网站的视频找不到连接&#xff0c;问我有没有什么办法,网站抓取m3u8链接 网页抓取m3u8链接。当时一听觉得应该简单&#xff0c;于是说我抽空看看。然后就分析目标网页&#xff0c;试图从网页源码里找出连接&#xff0c;有的源代码直接有,但是有的没有…

Java二十三种设计模式-代理模式模式(8/23)

代理模式&#xff1a;为对象访问提供灵活的控制 引言 代理模式&#xff08;Proxy Pattern&#xff09;是一种结构型设计模式&#xff0c;它为其他对象提供一个代替或占位符&#xff0c;以控制对它的访问。 基础知识&#xff0c;java设计模式总体来说设计模式分为三大类&#…

Varjo XR-4系列现已获得达索3DEXPERIENCE平台官方支持

近日&#xff0c;全球领先的工业虚拟和混合现实解决方案提供商Varjo宣布&#xff0c;Varjo XR-4系列现已获得达索3DEXPERIENCE平台的本地支持。这种集成为工程师和设计师带来了先进的虚拟和混合现实功能&#xff0c;他们可以通过沉浸式技术创新并简化他们的3D工作流程。 在达索…

【iOS】Tagged Pointer

目录 前言什么是Tagged Pointer&#xff1f;引入Tagged Pointer技术之前引入Tagged Pointer之后总结 Tagged Pointer原理&#xff08;TagData分析&#xff09;关闭数据混淆MacOS分析NSNumberNSString iOS分析 判断Tagged PointerTagged Pointer应用Tagged Pointer 注意点 Tagge…

Qt绘制指南针(仪表盘绘制封装使用)

指南针是一种用来确定方向的工具。它由一个磁针制成&#xff0c;其一端被磁化&#xff0c;可以自由旋转。当放置在水平面上时&#xff0c;磁针会指向地球的磁北极。通过观察磁针的指向&#xff0c;我们可以确定地理北方的方向。本示例是在Qt中绘制一个指南针&#xff0c;通过继…

Android WebViewClient 的 `shouldOverrideUrlLoading` 方法

简介 在Android开发中&#xff0c;WebView是一个强大的工具&#xff0c;可以在你的应用中显示网页内容。了解 WebViewClient 中的 shouldOverrideUrlLoading 方法是至关重要的&#xff0c;因为这个方法允许你控制 URL 在 WebView 中的处理方式。 在本文中&#xff0c;我们将详…

S71200 - 笔记

1 S71200 0 ProfiNet - 2 PLC编程 01.如何零基础快速上手S7-1200_哔哩哔哩_bilibili 西门子S7-1200PLC编程设计学习视频&#xff0c;从入门开始讲解_哔哩哔哩_bilibili

Linux:进程信号(一.认识信号、信号的产生及深层理解、Term与Core)

上次结束了进程间通信的知识介绍&#xff1a;Linux&#xff1a;进程间通信&#xff08;二.共享内存详细讲解以及小项目使用和相关指令、消息队列、信号量 文章目录 1.认识信号进程看待信号方式 2.信号的产生2.1信号的处理的方式 --- signal()函数2.2kill指令产生信号2.3键盘产生…

最新快乐二级域名分发系统重置版v1.7源码-最新美化版+源码+可对接支付

源码简介&#xff1a; 最新快乐二级域名分发系统重置版v1.7源码&#xff0c;它是最新美化版源码可对接支付。 快乐二级域名分发系统重置版v1.7源码&#xff0c;简单快捷、功能强大的控制面板。系统稳定长久&#xff0c;控制面板没任何广告&#xff0c;让网站更实用方便。 最…

现货白银交易中spring形态的应用

在现货白银市场中交易想取得成功并从市场中获利&#xff0c;掌握一些工具是必不可少的&#xff0c;而今天我们要介绍的现货白银的交易工具就是spring形态。 对于spring这个英文&#xff0c;我们都很熟悉&#xff0c;它有春天的意思&#xff0c;但这里所说的spring形态并不是指春…

ComfyUI进阶:Comfyroll节点 (最终篇)+应用实例

前言&#xff1a; 学习ComfyUI是一场持久战&#xff0c;而Comfyroll 是一款功能强大的自定义节点集合&#xff0c;专为 ComfyUI 用户打造&#xff0c;旨在提供更加丰富和专业的图像生成与编辑工具。借助这些节点&#xff0c;用户可以在静态图像的精细调整和动态动画的复杂构建…

【LabVIEW作业篇 - 5】:水仙花数、数组与for循环的连接

文章目录 水仙花数数组与for循环的连接 水仙花数 水仙花数&#xff0c;是指一个3位数&#xff0c;它的每个位上的数字的3次幂之和等于它本身。如371 3^3 7^3 1^3&#xff0c;则371是一个水仙花数。 思路&#xff1a;水仙花数是一个三位数&#xff0c;通过使用for循环&#xf…

redis的使用场景和持久化方式

redis的使用场景 热点数据的缓存。热点&#xff1a;频繁读取的数据。限时任务的操作&#xff1a;短信验证码。完成session共享的问题完成分布式锁。 redis的持久化方式 什么是持久化&#xff1a;把内存中的数据存储到磁盘的过程&#xff0c;同时也可以把磁盘中的数据加载到内存…

FPGA实现二选一数据选择器

在FPGA开发当中&#xff0c;我们最早开始接触的就是关于二选一选择器的设计。 1、原理 通过一个sel选择位判断输出out为a还是b&#xff0c;这里我们规定&#xff1a; sel0时&#xff0c;outa sel1时&#xff0c;outb 2、工程代码 多路选择器的缩写为MUX&#xff0c;这里我们见…

Git报错fatal: detected dubious ownership in repository

报错信息 fatal: detected dubious ownership in repository at 解决办法 一行代码解决 git config --global --add safe.directory "*";如何使用git工具初始胡项目并且和远程仓库建立联系 git init–建立一个本地仓库 git add README.md–将README.md文件加入…

【Day1415】Bean管理、SpringBoot 原理、总结、Maven 高级

0 SpringBoot 配置优先级 从上到下 虽然 springboot 支持多种格式配置文件&#xff0c;但是在项目开发时&#xff0c;推荐统一使用一种格式的配置 &#xff08;yml是主流&#xff09; 1 Bean管理 1.1 从 IOC 容器中获取 Bean 1.2 Bean 作品域 可以通过注解 Scope("proto…

计算机网络八股文(后续更新)

文章目录 一、计算机网络体系结构1、计算机网络的各层协议及作用&#xff1f; 二、物理层三、数据链路层四、网络层五、传输层1、TCP和UDP的区别&#xff1f;2、UDP 和 TCP 对应的应用场景是什么&#xff1f;3、详细介绍一下 TCP 的三次握手机制4、为什么需要三次握手&#xff…

测试管理工具、自动化测试工具、跨浏览器测试工具 推荐

测试管理工具 1&#xff09;Xray Xray 是排名第一的手动与自动化测试管理应用&#xff0c;专为质量保证而设计。它是一个功能齐全的工具&#xff0c;能够无缝集成于 Jira 中。其目的是通过有效和高效的测试帮助公司提高产品质量。 功能特点&#xff1a; 需求、测试、缺陷和执…