Java编程强化练习(二)

  1. 表达式计算(支持空格,连乘,连除)(选做题,不计分)

【问题描述】

从标准输入中读入一个整数算术运算表达式,如5 - 1 * 2 * 3 + 12 / 2 / 2  = 。计算表达式结果,并输出。

要求:
1、表达式运算符只有+、-、*、/,表达式末尾的’=’字符表示表达式输入结束,表达式中可能会出现空格;
2、表达式中不含圆括号,不会出现错误的表达式;
3、出现除号/时,以整数相除进行运算,结果仍为整数,例如:5/3结果应为1。

【输入形式】

在控制台中输入一个以’=’结尾的整数算术运算表达式。

【输出形式】

向控制台输出计算结果(为整数)。

【样例1输入】

5 - 1 * 2 * 3 + 12 / 2 / 2  =

【样例1输出】

2

【样例2输入】

500 =

【样例2输出】

500

【样例1说明】

输入的表达式为5 - 1 * 2 * 3 + 12 / 2 / 2 =,按照整数运算规则,计算结果为2,故输出2。

【样例2说明】

输入的表达式为500 = ,没有运算符参与运算,故直接输出500。

算法之一提示:
1、可以利用gets函数,读取整行表达式;
2、对于空格,可以考虑首先去除表达式中的所有空格
3、可以设一计数器用来记录已读取、但未参加运算的运算符的个数,根据该计数器来判断如何进行运算;
4、可以设计一函数:实现二元整数算术运算。

import java.util.Scanner;
import java.util.Scanner;
import java.util.Stack;public class ArithmeticExpression {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);String expression = scanner.nextLine();int result = evaluateExpression(expression);System.out.println( result);}private static boolean isOperator(char c) {return c == '+' || c == '-' || c == '*' || c == '/';}private static int getPrecedence(char op) {if (op == '+' || op == '-')return 1;if (op == '*' || op == '/')return 2;return 0;}private static int applyOperation(int num1, int num2, char op) {switch (op) {case '+':return num1 + num2;case '-':return num1 - num2;case '*':return num1 * num2;case '/':return num1 / num2;default:return 0;}}private static int evaluateExpression(String expression) {Stack<Integer> operands = new Stack<>();Stack<Character> operators = new Stack<>();for (int i = 0; i < expression.length(); i++) {char c = expression.charAt(i);if (Character.isWhitespace(c))continue;if (Character.isDigit(c)) {int num = c - '0';while (i + 1 < expression.length() && Character.isDigit(expression.charAt(i + 1))) {num = num * 10 + (expression.charAt(i + 1) - '0');i++;}operands.push(num);} else if (c == '(') {operators.push(c);} else if (c == ')') {while (!operators.isEmpty() && operators.peek() != '(') {int num2 = operands.pop();int num1 = operands.pop();char op = operators.pop();int result = applyOperation(num1, num2, op);operands.push(result);}operators.pop(); // 弹出左括号} else if (isOperator(c)) {while (!operators.isEmpty() && isOperator(operators.peek()) && getPrecedence(operators.peek()) >= getPrecedence(c)) {int num2 = operands.pop();int num1 = operands.pop();char op = operators.pop();int result = applyOperation(num1, num2, op);operands.push(result);}operators.push(c);}}while (!operators.isEmpty()) {int num2 = operands.pop();int num1 = operands.pop();char op = operators.pop();int result = applyOperation(num1, num2, op);operands.push(result);}return operands.pop();}
}

2.合并数列

【问题描述】从标准输入上读入2N行(行号从0开始)由空格分隔的整数,并顺序将第2i和2i+1行(0 <= i <= N)合并成一个由小到大排好序并删除重复数字的数列,写在标准输出上,每个数列一行。每一个原始数列不超过50个数字。
【输入形式】输入2N行整数,每行对应一个数列。每行有k个数字,是属于这一数列的所有整数,由空格分隔。这些整数随机排列,并可能含有重复数字。程序的任务就是将每两个相邻的数列合并成一个,并且从小到大排序,同时要删除重复数字。
【输出形式】输出有N行,每行有若干个空格分隔的整数,是在输入文件中对应两个输入行的合并结果。并且:
1.这些数字已经从小到大排序。
2.不含重复数字。
【样例输入】
18 29 30 27 26
20 30 5 29
76 80
99 233 87 35 24 9
27 234 27
65 70 39 87 35 24 100
【样例输出】
5 18 20 26 27 29 30
9 24 35 76 80 87 99 233
24 27 35 39 65 70 87 100 234
【样例说明】输入共有6行整数。第一个数列含5个整数,分别是18、29、30、27、26。依次类推,第二个数列含4个整数,第三个数列含2个整数,&hellip;&hellip;,第六个数列含7个整数。输出共有三行数字。输出的第一行是将原输出的第一、二个数列合并,同时删除重复数字并从小到大排序的结果。输出的第二行是将原输出的第三、四个数列合并,同时删除重复数字并从小到大排序的结果。输出的第三行是将原输出的第五、六个数列合并,同时删除重复数字并从小到大排序的结果。
【运行时限】要求每次运行时间限制在10秒之内。超出时间则认为程序错误。
【评分标准】输出的数字中。如果你的程序计算的完全正确,该测试点得10分,否则算该测试点得分为0。

import java.util.*;public class MergeAndSort {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);List<List<Integer>> result = new ArrayList<>();while (scanner.hasNextLine()) {String line = scanner.nextLine();if (line.isEmpty()) {break;}List<Integer> line1 = parseLine(line);if (!scanner.hasNextLine()) {// 如果只有单独的一行,直接输出该行而不进行合并result.add(line1);break;}List<Integer> line2 = parseLine(scanner.nextLine());if (line1.isEmpty() || line2.isEmpty()) {// 如果其中一行为空,直接输出非空的行if (!line1.isEmpty()) {result.add(line1);}if (!line2.isEmpty()) {result.add(line2);}} else {List<Integer> merged = mergeAndSort(line1, line2);result.add(merged);}}for (List<Integer> mergedList : result) {Collections.sort(mergedList); // 对每一行进行排序for (int num : mergedList) {System.out.print(num + " ");}System.out.println();}}private static List<Integer> parseLine(String line) {List<Integer> numbers = new ArrayList<>();String[] tokens = line.split(" ");for (String token : tokens) {numbers.add(Integer.parseInt(token));}return numbers;}private static List<Integer> mergeAndSort(List<Integer> list1, List<Integer> list2) {Set<Integer> set = new TreeSet<>();set.addAll(list1);set.addAll(list2);return new ArrayList<>(set);}
}

3.计算星期

【问题描述】
已知1980年1月1日是星期二。
任意输入一个日期,求这一天是星期几。
【输入形式】
从键盘输入一行字符串&ldquo;Y-M-D&rdquo;,是一个有效的公历日期。其中Y为年(1980&le;Y&le;3000),M为月,D为天,都不带有前缀0。
【输出形式】
在屏幕输出结果。
输出只有一行,是代表该日星期的字符串。对于星期一至星期日,分别输出Monday、Tuesday、Wednesday、Thursday、Friday、Saturday、Sunday。在行末要输出一个回车符。判断闰年的算法是:

年份能被4整除并且不能被100整除,或者能被四百整除。
【输入样例】
2004-1-6
【输出样例】
Tuesday
【评分标准】
本题不准使用数学库函数。运行时限1秒。结果完全正确得20分,每个测试点4分。

import java.util.Scanner;public class CalculateWeekday {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);String input = scanner.nextLine();String[] tokens = input.split("-");int year = Integer.parseInt(tokens[0]);int month = Integer.parseInt(tokens[1]);int day = Integer.parseInt(tokens[2]);int weekday = calculateWeekday(year, month, day);String weekdayString = getWeekdayString(weekday);System.out.println(weekdayString);}private static int calculateWeekday(int year, int month, int day) {// 计算从1980年1月1日到目标日期的总天数int days = calculateTotalDays(year, month, day);// 1980年1月1日是星期二,因此计算星期数时需要加上偏移量int offset = 2;// 对7取模,得到星期几的数值(0代表星期一,1代表星期二,以此类推)int weekday = ( days) % 7;return weekday;}private static int calculateTotalDays(int year, int month, int day) {// 每个月的天数int[] daysInMonth = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};// 判断是否为闰年,并更新2月的天数if (isLeapYear(year)) {daysInMonth[1] = 29;}int totalDays = 0;// 计算整年的天数for (int i = 1980; i < year; i++) {if (isLeapYear(i)) {totalDays += 366;} else {totalDays += 365;}}// 计算当年的天数for (int i = 0; i < month - 1; i++) {totalDays += daysInMonth[i];}totalDays += day;return totalDays;}private static boolean isLeapYear(int year) {return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);}private static String getWeekdayString(int weekday) {String[] weekdays = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"};return weekdays[weekday];}
}
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Scanner;public class CalculateWeekday {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);String input = scanner.nextLine();DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-M-d");LocalDate date = LocalDate.parse(input, formatter);DayOfWeek weekday = date.getDayOfWeek();String weekdayString = weekday.toString();System.out.println(weekdayString);}
}
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.util.Scanner;public class CalculateWeekday {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);String input = scanner.nextLine();String[] tokens = input.split("-");int year = Integer.parseInt(tokens[0]);int month = Integer.parseInt(tokens[1]);int day = Integer.parseInt(tokens[2]);LocalDate date = LocalDate.of(year, month, day);DayOfWeek weekday = date.getDayOfWeek();String weekdayString = weekday.toString().substring(0, 1) + weekday.toString().substring(1).toLowerCase();System.out.println(weekdayString);}
}

4、比较两组整数

【问题描述】
比较两组整数是否有相同的元素,不考虑元素的顺序,并忽略元素重复的情况。例如:
1  4  9  16  9  7  4  9  11
与下列一组整数:
11  7  9  16  4  1
相同。
【输入形式】
分行输入两组整数,以空格分割
【输出形式】
打印两组整数中相同的元素,顺序以第一行的整数输出顺序为准,如果没有相同元素,打印&ldquo;No Answer&rdquo;
【输入样例】
1 4  9  16  9  7  4  9  11
11  7  9  16  4  1
【输出样例】

"#"代表空格
1#4#9#16#7#11#
【样例说明】
输入两组整数
1  4  9  16  9  7  4  9  11
11  7  9  16  4  1
由于这两个数组具有相同的元素,顺序打印第一行与第二行相同的元素

【评分标准】
该题要求输出相同元素,答对得20分,每个测试点4分。

import java.util.*;public class CompareIntegers {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);String input1 = scanner.nextLine();String input2 = scanner.nextLine();String[] nums1 = input1.split(" ");String[] nums2 = input2.split(" ");Set<String> set1 = new LinkedHashSet<>(Arrays.asList(nums1));Set<String> set2 = new HashSet<>(Arrays.asList(nums2));set1.retainAll(set2);if (set1.isEmpty()) {System.out.println("No Answer");} else {StringBuilder output = new StringBuilder();for (String num : nums1) {if (set1.contains(num)) {output.append(num).append(" ");set1.remove(num);}}output.deleteCharAt(output.length() - 1);System.out.println(output.toString());}}
}

5、字符串匹配

问题描述】利用“通配符”,可以用简单的方法标记一组字符串。
通配符有两个,“?”代表一个任意字符,“*”代表0个或多个任意字符。
例如:
AB?.txt可以表示AB1.txt,AB2.txt,ABa.txt 等。
AB*.txt可以表示AB.txt, AB1.txt,AB332.txt,ABaa.txt等。
编写程序,判断一个字符串是否符合一个含有通配符的串。
【输入文件】从文件match.in读取输入。
第一行是一个串,含有通配符“?”或“*”,或两者兼有。
第二行是一个数字n(3≤n≤10),代表后续有n个待检验串。
后面的n行,每行有一个不含通配符的待检验串。
输入中的所有串均只包含英文字母(大小写)和数字,不含空格,长度在80字符以内。
【输出文件】输出到文件match.out中。将所有符合的串按原顺序分行打印。在每一行末均输出一个回车符。
【输入样例】
abcd?123*
4
abce123
abcda12345
abcda123
1234
【输出样例】
abcda12345
abcda123
【样例说明】abcda12345和abcda123符合abcd?123*的顺序。
【评分标准】结果正确则该测试点得满分,否则该测试点得0分。上传c语言源程序为match.c。

import java.util.Scanner;public class everydayjava {public static boolean matchPattern(String pattern, String text) {int m = pattern.length();int n = text.length();boolean[][] a = new boolean[m + 1][n + 1];a[0][0] = true;for (int i = 1; i <= m; i++) {for (int j = 0; j <= n; j++) {if (pattern.charAt(i - 1) == '*') {a[i][j] = a[i - 1][j] || (j > 0 && a[i][j - 1]);} else if (j > 0 && (pattern.charAt(i - 1) == '?' || pattern.charAt(i - 1) == text.charAt(j - 1))) {a[i][j] = a[i - 1][j - 1];}}}return a[m][n];}public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.print("请输入测试判断模板: ");String pattern = scanner.nextLine();System.out.print("请输入测试数据的个数: ");int n = scanner.nextInt();scanner.nextLine();System.out.println("请输入用于测试的字符串:");for (int i = 0; i < n; i++) {String text = scanner.nextLine();if (matchPattern(pattern, text)) {System.out.println(text);}}scanner.close();}
}

6.将文件中每一行字符反序

【问题描述】对于一个文本文件text1.dat,编写一个程序,将该文件中的每一行字符颠倒顺序后输出到另一个文件text2.dat中。
【输入文件】输入文件为当前目录下的text1.dat,该文件含有多行任意字符,也可能有空行。每个文本行最长不超过80个字符。在最后一行的结尾也有一个回车符。
【输出文件】输出文件为当前目录下的text2.dat。
【样例输入】设输入文件text1.dat为:
This is a test!
Hello, world!
How are you?
【样例输出】输出文件text2.dat为:
!tset a si sihT
!dlrow ,olleH
?uoy era woH
【样例说明】将输入文件反序输出。
【评分标准】输出文件应与输入文件的字符个数相等,并且符合题目规定的格式。如果你的程序输出正确,该测试点得满分,否则该测试点不得分。

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;public class ReverseLines {public static void main(String[] args) {String inputFile = "text1.dat";String outputFile = "text2.dat";try (BufferedReader reader = new BufferedReader(new FileReader(inputFile));BufferedWriter writer = new BufferedWriter(new FileWriter(outputFile))) {String line;while ((line = reader.readLine()) != null) {String reversedLine = reverseString(line);writer.write(reversedLine);writer.newLine();}System.out.println("Reversing lines completed successfully.");} catch (IOException e) {System.out.println("An error occurred: " + e.getMessage());}}private static String reverseString(String str) {StringBuilder reversed = new StringBuilder(str);return reversed.reverse().toString();}
}

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

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

相关文章

【vue】尚硅谷vue3学习笔记

Vue3快速上手 1.Vue3简介 2020年9月18日&#xff0c;Vue.js发布3.0版本&#xff0c;代号&#xff1a;One Piece&#xff08;海贼王&#xff09;耗时2年多、2600次提交、30个RFC、600次PR、99位贡献者github上的tags地址&#xff1a;https://github.com/vuejs/vue-next/release…

团队可能出现的问题以及应对方案

问题&#xff1a; 1、办公室政治&#xff1a;我的官比你大&#xff0c;你必须听我的&#xff0c;你的想法不重要&#xff0c;这样大家就不敢说话&#xff0c;表面和谐背地里勾心斗角。 2、信息不畅&#xff1a;正常的组织信息是流动的&#xff0c;因为有办公室政治大家就阻止…

使用tensorrt加速深度学习模型推断

使用tensorrt加速深度学习模型推断 1.import以及数据加载、构建engine函数2.导入官方模型及CIFAR100数据集3.不采用tensort的推断时间4.采用tensort加速—使用tensorrt 库4.1 导出onnx模型4.2 生成tensorrt engine 文件4.3 deserialize4.4 推断 5.采用tensort加速—使用torch2t…

mysql(八)docker版Mysql8.x设置大小写忽略

Mysql 5.7设置大小写忽略可以登录到Docker内部&#xff0c;修改/etc/my.cnf添加lower_case_table_names1&#xff0c;并重启docker使之忽略大小写。但MySQL8.0后不允许这样&#xff0c;官方文档记录&#xff1a; lower_case_table_names can only be configured when initializ…

SpringBoot集成knife4j

1&#xff09;添加knife4j的依赖 <dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version>3.0.2</version> </dependency>SpringBoot的版本&#xff1a; <pa…

机器人与3D视觉 Robotics Toolbox Python 一 安装 Robotics Toolbox Python

一 安装python 库 前置条件需要 Python > 3.6&#xff0c;使用pip 安装 pip install roboticstoolbox-python测试安装是否成功 import roboticstoolbox as rtb print(rtb.__version__)输出结果 二 Robotics Toolbox Python样例程序 加载机器人模型 加载由URDF文件定义…

【python】python列表的用法记录

文章目录 序言1. 列表的创建2. 列表的访问3. 列表的更新4. 列表的删除5. 列表的元素查找6. 列表的脚本操作符7. 列表的函数/方法8. 列表的一些其他操作 序言 总结字典的常见用法&#xff0c;以备查阅 1. 列表的创建 列表是python中最常用的数据类型&#xff0c;其数据项不需要…

【算法每日一练]-图论(保姆级教程篇12 tarjan篇)#POJ3352道路建设 #POJ2553图的底部 #POJ1236校园网络 #缩点

目录 POJ3352&#xff1a;道路建设 思路&#xff1a; POJ2553&#xff1a;图的底部 思路&#xff1a; POJ1236校园网络 思路&#xff1a; 缩点&#xff1a; 思路&#xff1a; POJ3352&#xff1a;道路建设 由于道路要维修&#xff0c;维修时候来回都不能走&#xff0c;现要…

MDK提示:在多字节的目标代码中,没有此Unicode 字符可以映射到的字符

MDK警告提示在多字节的目标代码中&#xff0c;没有此Unicode 字符可以映射到的字符 警告提示&#xff1a; 在写MDK的工程代码时&#xff0c;发现代码中引入的头文件前方出现一些红色的叉叉&#xff0c;但是编译工程并不报错&#xff0c;功能也能正常执行的&#xff0c;只是提…

JS利用时间戳倒计时案例

我们在逛某宝&#xff0c;或者逛某东时&#xff0c;我们时常看到一个倒计时&#xff0c;时间一到就开抢&#xff0c;这个倒计时是如何做的呢&#xff1f;让我为大家介绍一下。 理性分析一下&#xff1a; 1.用将来时间减去现在时间就是剩余的时间 2.核心&#xff1a;使用将来的时…

工业机器视觉megauging(向光有光)使用说明书(十五,轻量级的visionpro)

程序&#xff08;软件&#xff09;的一些不足和建议&#xff1a;&#xff08;后续会跟进&#xff09; 不足&#xff1a;&#xff08;如果你发现了&#xff0c;谢谢及时提出来&#xff09; 1&#xff0c;找线工具有噪点抑制功能&#xff1b;blob跟随工具&#xff0c;匹配跟随工…

C指针介绍(1)

文章目录 每日一言指针的简单介绍内存和地址指针在内存中的存储指针的定义和声明泛型指针 指针的关系运算算数运算关系运算 结语 每日一言 ⭐「 一声梧叶一声秋&#xff0c;一点芭蕉一点愁&#xff0c;三更归梦三更后。 」–水仙子夜雨-徐再思 指针的简单介绍 C语言指针是C语…

人工智能轨道交通行业周刊-第67期(2023.11.27-12.3)

本期关键词&#xff1a;列车巡检机器人、城轨智慧管控、制动梁、断路器、AICC大会、Qwen-72B 1 整理涉及公众号名单 1.1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS World轨道交通联盟VSTR铁路与城市轨道交通RailMetro…

python调用打印机并打印

【01获取打印机列表】 要获取Python中的打印机列表&#xff0c;可以使用win32print模块&#xff08;适用于Windows系统&#xff09;或cups模块&#xff08;适用于Linux和macOS系统&#xff09;。 以下是使用这两个模块分别获取打印机列表的示例代码&#xff1a; **在Windows…

算法工程师面试八股(搜广推方向)

文章目录 机器学习线性和逻辑回归模型逻辑回归二分类和多分类的损失函数二分类为什么用交叉熵损失而不用MSE损失&#xff1f;偏差与方差Layer Normalization 和 Batch NormalizationSVM数据不均衡特征选择排序模型树模型进行特征工程的原因GBDTLR和GBDTRF和GBDTXGBoost二阶泰勒…

React使报错不再白屏

如果代码中出现问题导致报错&#xff0c;通常会使页面报错&#xff0c;导致白屏 function Head() {// 此时模拟报错导致的白屏return <div>Head --- {content}</div> } export default () > {return (<><div>下面是标题</div><Head />…

若依框架分页

文章目录 一、分页功能解析1.前端代码分析2.后端代码分析3. LIMIT含义 二、自定义MyPage,多态获取total1.定义MyPage类和对应的调用方法 一、分页功能解析 1.前端代码分析 页面代码 封装的api请求 接口请求 2.后端代码分析 controller代码 - startPage() getDataTable(…

yolo.txt格式与voc格式互转,超详细易上手

众所周知,yolo训练所需的标签文件类型是.txt的,但我们平时使用标注软件(labelimage等)标注得到的标签文件是.xml类型的,故此xml2txt之间的转换就至关重要了,这点大家不可能想不到,但是网上的文章提供的代码大多数都是冗余,或者难看,难以上手,故此作者打算提供一个相对…

String StringBuilder

String 特点&#xff1a; 1.双引号的字符串是String类的对象&#xff0c;可以点方法 2.字符串一旦创建&#xff0c;其内容不可改变 3.字符串常量池可以共享 方法 equals()&#xff1a;比较字符串的内容toCharArray()&#xff1a;转为字符数组字符串.charAt(int index)&#x…

Sharding-Jdbc(3):Sharding-Jdbc分表

1 分表分库 LogicTable 数据分片的逻辑表&#xff0c;对于水平拆分的数据库(表)&#xff0c;同一类表的总称。 订单信息表拆分为2张表,分别是t_order_0、t_order_1&#xff0c;他们的逻辑表名为t_order。 ActualTable 在分片的数据库中真实存在的物理表。即上个示例中的t_…