【刷题册】2024.10.13 - 2024.10.15

news2024/10/17 8:35:35

目录

  • 一、2024.10.13
    • 1.1 BC153 [NOIP2010]数字统计
    • 1.2 NC313 两个数组的交集
      • 1.2.1 思路一:暴力O(N^2)
      • 1.2.2 思路二:hash
    • 1.3 AB5 点击消除
  • 二、2024.10.14
    • 2.1 BC64⽜⽜的快递
    • 2.2 DP4 最⼩花费爬楼梯
    • 2.3 数组中两个字符串的最⼩距离
  • 三、2024.10.15
    • 3.1 BC149 简写单词
    • 3.2 dd爱框框
    • 3.3 除2!

一、2024.10.13

1.1 BC153 [NOIP2010]数字统计

题目链接:BC153 [NOIP2010]数字统计
题目描述:

解题思路:

  • 枚举,直接循环对两数字之间的所有数拆分看每个数的含2个数。
  • 拆分方法:数字取余10,看个位数是否为2,然后让数字除10,直到数字小于0为止。

解题代码:

public static void main(String[] args) {
        //输入
        Scanner in = new Scanner(System.in);
        int first = in.nextInt();
        int last = in.nextInt();

        int ret = 0;
        for(int i = first; i <= last; i++) {
            ret += count(i);
        }

        System.out.println(ret);
    }
    //记录数中2个数
    private static int count(int num) {
        int ret = 0;
        while(num > 0) {
            if(num % 10 == 2) ret++;
            num = num / 10;
        }
        return ret;
    }

1.2 NC313 两个数组的交集

题目链接:NC313 两个数组的交集

题目描述:

题目分析:就是找出两数组的相同元素,且结果数组中元素是不能重复的。

1.2.1 思路一:暴力O(N^2)

直接使用两层for循环,第一个for拿到nums1中的每一个数,与第二个中的所有元素进行比较,相同存入结果数组(注意结果数组中是否已经有了该数,如nums1 = {2,2},nums2 = {2,2})。

解题代码

public ArrayList<Integer> intersection (ArrayList<Integer> nums1, ArrayList<Integer> nums2) {
        ArrayList<Integer> ret = new ArrayList<Integer>();
        for(int i = 0; i < nums1.size(); i++) {
            Integer cur = nums1.get(i);
            for( int j = 0; j < nums2.size(); j++) {
                if(cur.equals( nums2.get(j) )) {
                //注意排除已经有的值
                    if(!ret.contains(cur)) ret.add(cur);
                    break;
                }
            }
        }
        return ret;
    }

1.2.2 思路二:hash

将第一个数组存入hash表中,然后遍历第二个数组看hash表中是否有这个数。
但是由于数据范围是1000,是很小的,我们就不使用集合类HashMap,

直接使用一个布尔数组来表示,

  • 遍历nums1数组,将nums1数组中元素作为布尔数组中true值的下标,其余为false;
  • 在遍历nums2数组,看nums2数组中元素作为下标的布尔数组中只是不是true;
  • 是true就将该元素存入结果数组中,并将布尔数组置为false(防止重复数据)。
public ArrayList<Integer> intersection (ArrayList<Integer> nums1, ArrayList<Integer> nums2) {
        boolean[] hash = new boolean[1010];
        ArrayList<Integer> ret = new ArrayList<Integer>();
        for(int i = 0; i < nums1.size(); i++) {
            hash[nums1.get(i)] = true;
        }
        for(int i = 0; i < nums2.size(); i++) {
            if(hash[nums2.get(i)]) {
                ret.add(nums2.get(i));
                hash[nums2.get(i)] = false;
            }
        }
        return ret;
}

1.3 AB5 点击消除

题目链接:AB5 点击消除

题目描述:

解题思路:

  • 我们使用栈来模拟操作,拿到一个字母就与栈顶元素比较,相同就出栈,不同就进栈。
  • 但是使用Stack类的话,我们最后拿到的栈顶到栈尾的,toString方法也不行。我们就使用StringBuilder来模拟实现。
public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String str = in.next();
        
        StringBuilder ret = new StringBuilder("");
        for(int i = 0; i <str.length(); i++) {
            char ch = str.charAt(i);
            if(ret.length() != 0 && ch == ret.charAt(ret.length()-1) ) {
                //出栈
                ret.deleteCharAt(ret.length()-1);
            } else {
            	//进栈
                ret.append(str.charAt(i));
            }            
        }
        //注意判断栈是否为空
        System.out.println(ret.length() == 0? 0 : ret.toString());
    }

二、2024.10.14

2.1 BC64⽜⽜的快递

题目链接:BC64 ⽜⽜的快递
题目描述:

题目解析:一道小学数学题,只介绍对小数的处理:

  • 法1:直接调用Math类中的ceil()库方法向上取整;
  • 法2:使用a-(int)a与0进行比较,看是否有小数,有就结果加1。

代码:

//法1:
public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        float a = in.nextFloat();
        char b = in.next().charAt(0);

        int ret = 20;
        if(b == 'y') ret += 5;

        if(a > 1.0) {
            ret = ret  - 1 + (int)Math.ceil(a);
        }

        System.out.println(ret);
}
//法二:
public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        //输入处理
        float a = in.nextFloat();
        String str = in.nextLine();
        char b = str.charAt(1);

        int ret = 20;
        //是否加急
        if(b == 'y') ret += 5;
        //是否超出1
        if(a > 1) {
            float temp = a - (int)a ;
            //是否有小数
            if(temp != 0.0) ret += 1;
            ret  = ret + (int)a - 1;
        }
        System.out.println(ret);
}

2.2 DP4 最⼩花费爬楼梯

题目链接:DP4 最⼩花费爬楼梯

题目描述:

题目分析:
这是一道简单的动态规划题目,看题目给出的实例终点是走出数组。

  • 动态方程 dp[i] = Math.min(dp[i-1] + cost[i-1] , dp[i-2] + cost[i-2]);

代码:

import java.util.*;
class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int[] cost = new int[n];
        cost[0] = in.nextInt();
        int[] dp = new int[n+1];
        
        for(int i = 2; i <= n; i++) {
            cost[i-1] = in.nextInt();
            dp[i] = Math.min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2]);
        }
        System.out.println(dp[n]);
    }
}

2.3 数组中两个字符串的最⼩距离

链接找不到,下架了
题目描述:

题目解析:
题目给得很明确,在strs数组中找str1和str2之间的最小距离。

解题思路:

  • 法1:使用两层for循环,找到一个str1,就从当前开始找str2,如果结果ret更小,就更新。
  • 法2:对法1的优化,我们只需要使用两个变量flag0和flag1分别表示当前找到的str1和str2的位置,在找到一个str1或者str2的时候与最近的相减(也就是flag1-flag0的绝对值)再与结果ret比较,小就更新。
import java.io.*;
public static void main(String[] args) throws IOException{
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
 int len = Integer.parseInt(reader.readLine());
 String[] strs = reader.readLine().split(" ");
 String str1 = strs[0], str2 = strs[1];
        String[] strs = new String[len];
        for(int i = 0; i < len; i++) strs[i] = in.next();

        int ret = 0x3f3f3f3f;

        int flag0 = 0;
        int flag1 = 0;
        for(int i = 2; i < len ; i++) {
            if(strs[i].equals(str1) ) {
                flag0 = i;
            }
            if(strs[i].equals(str2)) {
                flag1 = i;
            }
            if(ret == 0 || ret > Math.abs(flag1 - flag0)) ret =  Math.abs(flag1 - flag0);
        }
        if(flag0 == 0 || flag1 == 0) System.out.println(-1);
        else System.out.println(ret);
    }

三、2024.10.15

3.1 BC149 简写单词

题目链接: BC149 简写单词
题目描述:

简单题不用解析。
代码:

import java.util.*;
class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while(in.hasNext()) {
            char ch = in.next().charAt(0);          
            System.out.print((ch <= 'z'&& ch >= 'a') ? (char)(ch - 32) : ch);
        }
    }
}

3.2 dd爱框框

题目链接:dd爱框框

题目描述:

题目解析:题目要求我们找出最小区间中的数组元素和大于等于x的左右下标值。

解题思路:

  1. 暴力解法:使用两层for循环,一层i代表左下标,第二层j循环从i下标开始去求右下标,找到最小区间长度即可,但是数组长度n的值很大,这样是会超时的。
  2. 对暴力解法优化,滑动窗口/同向双指针:
    2.1. 数组中的数据全是大于1的正数,证明当我们找到一个区间的数是大于x的时候left左指针向后走一位的时候,right–不会出现区间数组和变大的情况。
    2.2 直接使用Scannner由于数据量大,会出现超时,要使用自定义快读类。

代码:

import java.util.StringTokenizer;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Main {
    public static void main(String[] args) throws IOException {
        Read in = new Read();
        int n = in.nextInt();
        int x = in.nextInt();
        int[] arr = new int[n+1];
        for(int i = 1; i <= n; i++) {
            arr[i] = in.nextInt();
        }
        
        int left = 1, right = 1,sum = 0;
        int retLeft = 0, retRight = 0, retLen = 0X3f3f3f3f;
        
        while(right <= n) {
            //进窗口
            sum += arr[right];
            
            //更新结果
            while(sum >= x) {
                if(retLen > right - left + 1) {
                    retLeft = left;
                    retRight = right;
                    retLen = retRight - retLeft + 1; 
                }
                //出窗口
                sum -= arr[left++];
            }
            
            right++;
        }
        System.out.println(retLeft + " " + retRight);
    }
}

class Read {
	StringTokenizer st = new StringTokenizer("");
	BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));

	String next() throws IOException {
		while(!st.hasMoreTokens()) {
			st = new StringTokenizer(bf.readLine());
		}
		return st.nextToken();
	}
	int nextInt() throws IOException {
		return Integer.parseInt(next());
	}
}

3.3 除2!

题目链接:除2!

题目描述:

题目解析:这道题目就是给你最多k次让偶数除2操作,使最后数组元素和最小。

解题思路:

  • 因为是对偶数除2,并且要让最后数组和尽可能小,那么我们就可以使用大根堆来存储偶数
  • 注意k只是最多可以操作的次数,有可能最后数组中已经没有偶数,而k的次数还没执行完;
  • 我们先将给的数据和加起来,每出一次大根堆就减去,在判断除2后是不是还是偶数,是就进堆。

代码:

import java.util.Scanner;
import java.util.PriorityQueue;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        long n = in.nextLong();
        int k = in.nextInt();
        
        PriorityQueue<Long> heap = new PriorityQueue<>((a,b) -> {
           return (int)(b - a); 
        });
        
        long sum = 0;
        while(in.hasNextLong()) {
            long temp = in.nextInt();
            sum += temp;
            if(temp % 2 == 0) {
                heap.add(temp);
            }
        }
        
        while(!heap.isEmpty() && k > 0) {
            long temp = heap.poll() / 2;
            sum -= temp;
            if(temp % 2 == 0) {
                heap.add(temp);
            }
            k--;
        }
        System.out.println(sum);
    }
}

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

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

相关文章

操作系统实验一:Linux进程管理及其扩展

实验目的&#xff1a; 通过实验&#xff0c;加深理解进程控制块、进程队列等概念&#xff0c;了解进程管理的具体实施方法。 实验内容&#xff1a; 1. 阅读并分析Linux内核源代码&#xff0c;了解进程控制块、进程队列等数据结构&#xff1b; 2. 实现一个系统调用&#xff…

基于springboot留守儿童爱心网站

作者&#xff1a;计算机学长阿伟 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、ElementUI等&#xff0c;“文末源码”。 系统展示 【2024最新】基于JavaSpringBootVueMySQL的&#xff0c;前后端分离。 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;…

C++核心编程和桌面应用开发 第十一天(静态转换 动态转换 常量转换 重新解释转换)

目录 1.静态类型转换 1.1语法 1.2用法 2.动态类型转换 2.1语法 2.2用法 3.常量类型转换 3.1语法 3.2用法 4.重新解释转换 4.1语法 1.静态类型转换 1.1语法 static_cast<目标转换类型>(待转换变量) 1.2用法 可用于基本数据类型之间的转换。比如int和char之…

Input-Source-Pro:自动切换输入法并提示状态

Input Source Pro 是一款 macOS 上的输入法辅助工具&#xff0c;它可以根据不同应用、不同网站来自动切换输入法&#xff0c;并可以在鼠标周围显示当前输入法状态。 macOS 不像 Windows 那样能保存输入法状态&#xff0c;因此这样的软件还是挺有用的。 ‍ 介绍 官网&#x…

前后端请求一致性学习

在进行前后端分离开发项目的过程中&#xff0c;前后端同学往往需要依照接口文档的基本信息以及相应的响应格式进行接口请求的开发&#xff0c;在这个过程中涉及到常见的Get、Post、Put、Patch等等的请求&#xff0c;相应的前后端的书写格式是什么&#xff0c;这篇文章进行一个记…

keil 配置栈溢出保护(arm)

1.前提是keil 配置为arm-gcc 编译器环境 2.配置编译项加上 -fstack-protector-strong 栈溢出的测试代码: void aaa(int a, char c) { char arr[5]; arr[a] = c; } aaa(8, d);//任意地方调用,超过数组arr的元素 添加代码栈溢出检测: uint32_t __stack_chk_gua…

WhatsApp防死号应该怎么做?

“WhatsApp又死号了”——外贸人的噩梦每天都会上演。号损是小事&#xff0c;重要是是成千上万的客户累计与聊天记录被一扫而空&#xff0c;所以相信我&#xff0c;当你准备好最WhatsApp&#xff0c;那么WhatsApp账号养成的操作从一开始就要注意并且牢记&#xff01;下面给大家…

Golang | Leetcode Golang题解之第482题秘钥格式化

题目&#xff1a; 题解&#xff1a; func licenseKeyFormatting(s string, k int) string {ans : []byte{}for i, cnt : len(s)-1, 0; i > 0; i-- {if s[i] ! - {ans append(ans, byte(unicode.ToUpper(rune(s[i]))))cntif cnt%k 0 {ans append(ans, -)}}}if len(ans) &…

Unity Spine优化思路

最近终于闲下来了&#xff0c;于是开始把近期探索到的unity相关优化整理起来。 我们的项目采用的人物表现方式是spine动画&#xff0c;这在2D游戏里算比较常见的解决方案了&#xff0c;但是里面有一些设置需要提前注意一下&#xff0c;否则会造成不必要的性能浪费。 养成读官…

【实战指南】Vue.js 介绍组件数据绑定路由构建高效前端应用

学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、手把手教你开发炫酷的vbs脚本制作(完善中……&#xff09; 4、牛逼哄哄的 IDEA编程利器技巧(编写中……&#xff09; 5、面经吐血整理的 面试技…

WPF入门_01布局

WPF布局包括两个阶段&#xff1a;一个测量&#xff08;measure&#xff09;阶段和一个排列(arrange)阶段.每个Panel都提供了自己的MeasureOverride和ArrangeOverride方法 1、Canvas 布局控件 Canvas面板是最轻量级的布局容器&#xff0c;它不会自动调整内部元素的排列和大小&…

仿 Mac 个人网站开发 |项目复盘

一、前言 1.1 灵感来源 早年有幸看到国外大佬做的一个 基于 Web 的 Windows XP 桌面娱乐系统, 那时刚好有搭建一个个人博客的想法, 所以就想是否可以基于 WEB 实现一个仿 Mac UI 的个人博客, 以应用的形式来展示博客各个功能! 1.2 相关链接(求个 Star) 前端开源代码后端开源…

计算机网络—vlan(虚拟局域网)

内容补充 冲突域 如果两台设备同时发送数据&#xff0c;他们的数据会互相干扰&#xff0c;那么他们就处于同一冲突域&#xff0c;例如集线器&#xff08;总线型&#xff0c;所有设备共享带宽&#xff09;的所有端口都处于冲突域。 广播域 如果一台设备发送数据&#xff0c;…

怎么为pdf文件设置密码?几种PDF文件设置密码的方法推荐

怎么为pdf文件设置密码&#xff1f;设置PDF文件密码&#xff0c;正是应对这一挑战的有效手段之一。通过为PDF文件设置密码&#xff0c;我们能够为文档加上一道安全锁&#xff0c;确保只有掌握密码的用户才能打开和查看文件内容。这一措施不仅保护了文档的隐私性&#xff0c;还防…

【C++11入门】新特性总结之lambda表达式

现代C语言的核心特征之一&#xff1a;lambda表达式。虽然其它编程语言早已具备了这种特性&#xff0c;但直到C11标准发布&#xff0c;C11才具备了lambda表达式。本节主要讲解lambda表达式的语法和使用方法。具体包括&#xff1a;捕获列表、可选参数列表、可选异常说明符、可选返…

5分钟精通Windows环境变量

科普内容 what why how&#xff08;WWH&#xff09;三步走 1. what&#xff1a;Windows环境变量是什么 Windows环境变量&#xff0c;本质上是告诉了Windows操作系统一堆文件夹路径&#xff0c;如下图 2. why&#xff1a; 创造Windows环境变量的目的 发明Windows环境变量是为了…

多机编队—(3)Fast_planner无人机模型替换为Turtlebot3模型实现无地图的轨迹规划

文章目录 前言一、模型替换二、Riz可视化三、坐标变换四、轨迹规划最后 前言 前段时间已经成功将Fast_planner配置到ubuntu机器人中&#xff0c;这段时间将Fast_planner中的无人机模型替换为了Turtlebot3_waffle模型&#xff0c;机器人识别到环境中的三维障碍物信息&#xff0…

HarmonyOS开发(ArkUI简单使用)

一、开发准备 1.官网 https://developer.huawei.com/consumer/cn/ 2.工具 DevEco Studio 下载&#xff1a; 下载中心 | 华为开发者联盟-HarmonyOS开发者官网&#xff0c;共建鸿蒙生态 3.安装 4.开发组件ArkTs ArkTS是HarmonyOS主力应用开发语言。它在TypeScript&#xf…

分享一个关于产线工控安全的主机加固方案

在数字化时代&#xff0c;数据安全是企业运营的重中之重。勒索病毒作为一种新型的网络攻击手段&#xff0c;已经成为全球范围内企业面临的严峻挑战。最近&#xff0c;一起震惊全球的勒索病毒事件再次敲响了警钟&#xff1a;一家国际航运巨头遭受了勒索软件攻击&#xff0c;导致…

设计模式和软件框架的关系

设计模式和软件框架在软件开发中都有助于解决复杂问题和提高代码质量&#xff0c;但它们在概念和使用上存在一些区别。它们的关系可以通过以下几点理解&#xff1a; 层次与抽象程度 设计模式&#xff08;Design Patterns&#xff09;是一组通用的、可复用的解决方案&#xff0…