算法题目整合4

news2024/11/15 4:18:21

文章目录

  • 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.coloradmin.cn/o/1942887.html

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

相关文章

FPGA DNA 获取 DNA_PORT

FPGA DNA DNA 是 FPGA 芯片的唯一标识&#xff0c; FPGA 都有一个独特的 ID &#xff0c;也就是 Device DNA &#xff0c;这个 ID 相当于我们的身份证&#xff0c;在 FPGA 芯片生产的时候就已经固定在芯片的 eFuse 寄存器中&#xff0c;具有不可修改的属性。在 xilinx 7series…

Adobe国际认证详解-职业发展规划指南

Adobe国际认证&#xff0c;又称为Adobe Certified Professional&#xff08;简称ACP&#xff09;&#xff0c;是Adobe公司CEO签发的权威国际认证体系。这一认证体系基于Adobe核心技术及岗位实际应用操作能力的测评&#xff0c;旨在为用户提供创意软件的专业认证。 Adobe国际认证…

win11 安装 Gradle以及通过Gradle 编译Spring boot 2.7.x源码

一、win11 安装Gradle(7.5.1)&#xff1a; 1.1、下载二进制包 Gradle下载页面 1.2、配置环境变量 变量名&#xff1a;GRADLE_HOME 变量值&#xff08;二进制包解压路径&#xff09;&#xff1a;D:\develop-tool\gradle-7.5.1 变量名&#xff1a;GRADLE_USER_HOME 变量值&a…

知识表示 | 利用 Protégé 软件构建小型本体

Hi&#xff0c;大家好&#xff0c;我是半亩花海。本项目旨在利用 Protg 软件构建小型本体&#xff0c;探索本体建模的实际应用&#xff0c;特别是应用本体与上层本体之间的关系继承与映射。我们将重点理解应用本体如何继承上层本体的关系&#xff0c;以及如何通过推理机制揭示实…

线性dp.

线性dp&#xff0c;在进行动态规划中&#xff0c;常以线性的形式表现出来。 我们仍用闫氏dp法来进行求解即可 一、状态表示&#xff1a;当前的状态所代表的含义以及能用几维的形式表现出来。包括①集合&#xff0c;②属性 二、状态计算&#xff1a;如何一步一步的将状态计算出…

Hostspot2.0网络是什么?

Hotspot 2.0是一种无线网络技术标准&#xff0c;它是由Wi-Fi联盟推出的&#xff0c;旨在改善公共Wi-Fi热点的用户体验&#xff0c;简化连接流程&#xff0c;提升安全性&#xff0c;并提供更好的漫游体验。Hotspot 2.0也被称为Passpoint&#xff08;Passpoint Release 2&#xf…

Go基础编程 - 12 -流程控制

流程控制 1. 条件语句1.1. if...else 语句1.2. switch 语句1.3. select 语句1.3.1. select 语句的通信表达式1.3.2. select 的基特性1.3.3. select 的实现原理1.3.4. 经典用法1.3.4.1 超时控制1.3.4.2 多任务并发控制1.3.4.3 监听多通道消息1.3.4.4 default 实现非堵塞读写 2. …

【全网首发】小红书最新引流法:轻松留联系方式卡片,直接上演无举报窗口

大家好&#xff01;我是闷声轻创&#xff01;根据最新消息小红书卡片可能会被禁止掉&#xff0c;这对我们的引流矩阵有真不小的冲击&#xff0c;毕竟小红书作为国内领​先的年轻人的生活分享社区&#xff0c;但上有政策下有对策&#xff0c;我今天发现了一个新的留V的方法&…

七天打造一套量化交易系统:Day2-量化交易策略基本模型及要点

七天打造一套量化交易系统&#xff1a;Day2-量化交易策略基本模型及要点 前期回顾趋势型策略模型原理收益分布重点&#xff1a;什么因素能改进策略&#xff08;截断亏损&#xff0c;让利润奔跑&#xff09;要点总结 均值回复型策略模型原理收益分布重点&#xff1a;避免大额亏损…

去掉roscore的python依赖概述

去掉roscore的python依赖概述 文章目录 去掉roscore的python依赖概述roscore有哪些功能思路关于rosmaster本身及其API的介绍 需要实现的核心API代码实现附录(网图) roscore有哪些功能 启动一个rosmaster节点 调用roslaunch在子进程中&#xff08;popen&#xff09;启动rosmast…

浪潮自研交换机系列常见问题处理

CN61108PC-V-H 不能PING通任何地址&#xff0c;也不能被PING 输入ip traceroute enable既可。注意视图 交换机通过console口远程登录至其他交换机&#xff0c;掉线后console口无法使用 例如有2台交换机A和B&#xff0c;在A交换机上插上console线登录后&#xff0c;在A通过SSH…

【入门教程一】基于DE2-115的My First FPGA 工程

1.1. 概述 这是一个简单的练习&#xff0c; 可以帮助初学者开始了解如何使用Intel Quartus 软件进行 FPGA 开发。 在本章节中&#xff0c;您将学习如何编译 Verilog 代码&#xff0c;进行引脚分配&#xff0c;创建时序约束&#xff0c;然后对 FPGA 进行编程&#xff0c;驱动开…

数据结构:二叉搜索树(简单C++代码实现)

目录 前言 1. 二叉搜索树的概念 2. 二叉搜索树的实现 2.1 二叉树的结构 2.2 二叉树查找 2.3 二叉树的插入和中序遍历 2.4 二叉树的删除 3. 二叉搜索树的应用 3.1 KV模型实现 3.2 应用 4. 二叉搜索树分析 总结 前言 本文将深入探讨二叉搜索树这一重要的数据结构。二…

【Vite】快速入门及其配置

概述 Vite是前端构建工具。vite 相较于webpack,vite采用了不同的运行方式&#xff1a; 开发时&#xff0c;并不对代码打包&#xff0c;而是直接采用ESM的方式来运行项目在项目打包部署时&#xff0c;使用 rollup 对项目进行打包除了速度外&#xff0c;vite使用起来也更加方便…

FPGA-ROM IP核的使用

1.理论 ROM全称&#xff1a;Read-Only Memory&#xff0c;也就是只读型固态半导体存储器&#xff0c;即一旦存储信息&#xff0c;无法再改变&#xff0c;信息也不会因为电源关闭消失。但在FPGA中&#xff0c;实际使用的ROM IP核并不是真正的ROM&#xff0c;其实都是内部的RAM资…

关于企业开展数据资产入表新模式

随着数字化转型持续推进&#xff0c;数据的资产化已成为数字时代不可逆转的趋势。企业数据资产入表已进入倒计时&#xff0c;企业是否科学高效地管理与评估数据&#xff0c;影响着企业是否能够意识到数据应作为资产存在&#xff0c;是否将数据纳入财务报表&#xff0c;并利用数…

【YOLOv5/v7改进系列】引入CoordConv——坐标卷积

一、导言 与标准卷积层相比&#xff0c;CoordConv 的主要区别在于它显式地考虑了位置信息。在标准卷积中&#xff0c;卷积核在输入上滑动时&#xff0c;仅关注局部区域的像素强度&#xff0c;而忽略其绝对位置。CoordConv 通过在输入特征图中添加坐标信息&#xff0c;使得卷积…

探索PyPDF2:Python中的PDF处理大师

探索PyPDF2&#xff1a;Python中的PDF处理大师 1. 背景介绍 在数字化时代&#xff0c;PDF文件因其跨平台的兼容性和内容的稳定性而广受欢迎。然而&#xff0c;处理PDF文件&#xff0c;如合并、分割、提取文本等&#xff0c;往往需要专门的工具。这就是PyPDF2库的用武之地。PyP…

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文件加入…

【技术升级】Docker环境下Nacos平滑升级攻略,安全配置一步到位

目前项目当中使用的Nacos版本为2.0.2&#xff0c;该版本可能存在一定的安全风险。软件的安全性是一个持续关注的问题&#xff0c;尤其是对于像Nacos这样的服务发现与配置管理平台&#xff0c;它在微服务架构中扮演着核心角色。随着新版本的发布&#xff0c;开发团队会修复已知的…