西安交通大学915考研–编程题Java代码踩坑(2018年真题)
目录
2018.1–统计字符串中每种字符的个数
思路:
- 考虑使用哈希表存储每种字符
- 遇到哈希表里没有的字符,放进哈希表,初始值为1;
- 遇到哈希表里有的字符,更新对应键的值
- 遍历输出哈希表
代码实现:
package Ayan;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
/**
* @Author: cc雪影
* @Description:
* @Date: Create in 17:49 2022/1/10
*/
public class A2018_01 {
public static void main(String[] args) {
Map<Character, Integer> map = new HashMap<>();
Scanner in = new Scanner(System.in);
String s = in.next();
char arr[] = s.toCharArray();
int temp;
for (char a : arr) {//遍历数组,进行键的比对、值的更新
if (a - '#' == 0) {
break;
} else if (map.containsKey(a)) {
temp = map.get(a);
temp++;
map.put(a, temp);
} else {
map.put(a, 1);
}
}
for (Character key : map.keySet()) {//遍历map
System.out.print(key + ":" + map.get(key) + " ");
}
}
}
输入输出:
fie7892wqg33#
q:1 2:1 3:2 e:1 f:1 7:1 w:1 g:1 8:1 i:1 9:1
2018.2–对象化数据的排序
思路:
- 创建一个类Student,设置公共属性,姓名:String Name;学号,int No;成绩, int grade
使用。并构造对应的get set方法,方便进行对象数据操作。 - 通过Scanner类接收输入的数据,存储到Student数据类型的实体对象中,特别注意,要使用前要先对Student类型数据进行存储空间的分配(即用new方法给Student类型的数组元素进行分配空间,这是因为Student不是基本数据类型)。
- 通过冒泡排序对数据类型的元素以成绩为关键字进行排序,对应的要把学号和姓名这些属性对应的做相同操作。
- 遍历输出Student类型的数组
代码实现:
Student类:
package Ayan;
public class Student {
public String Name;
public int No;
public int grade;
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
public int getNo() {
return No;
}
public void setNo(int no) {
No = no;
}
public int getGrade() {
return grade;
}
public void setGrade(int grade) {
this.grade = grade;
}
}
主类:
package Ayan;
import java.util.Scanner;
public class A2018_02 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入学生的个数:");
int num = scanner.nextInt();
String name;
int grade, no;
Student[] stu = new Student[num];//!!!分配空间
for (int i = 0; i < num; i++) {
stu[i] = new Student();//!!!创建对象,Student是非基本数据类型,需要手动依次创建,不然会报错
}
System.out.println("请依次输入" + num + "位同学的姓名、学号、成绩:");
for (int i = 0; i < num; i++) {//接收学生信息
name = scanner.next();
no = scanner.nextInt();
grade = scanner.nextInt();
stu[i].setName(name);
stu[i].setNo(no);
stu[i].setGrade(grade);
}
sort(stu);//给学生按照成绩排序
for (int i = 0; i < num; i++) {//输出学生信息(已排序)
System.out.println(stu[i].getName() + "的学号是" + stu[i].getNo() + ",他的成绩是" + stu[i].getGrade());
}
}
public static void sort(Student arr[]) {
Student tem_stu = new Student();//中间变量
for (int i = arr.length - 1; i > 0; i--) {
for (int j = 0; j < i; j++) {
if (arr[j].getGrade() < arr[j + 1].getGrade()) {
tem_stu.setName(arr[j].getName());
tem_stu.setGrade(arr[j].getGrade());
tem_stu.setNo(arr[j].getNo());
arr[j].setName(arr[j + 1].getName());
arr[j].setGrade(arr[j + 1].getGrade());
arr[j].setNo(arr[j + 1].getNo());
arr[j + 1].setName(tem_stu.getName());
arr[j + 1].setGrade(tem_stu.getGrade());
arr[j + 1].setNo(tem_stu.getNo());
}
}
}
}
}
输入输出:
请输入学生的个数:
4
请依次输入4位同学的姓名、学号、成绩:
q 1 98
w 2 99
e 3 91
r 4 95
w的学号是2,他的成绩是99
q的学号是1,他的成绩是98
r的学号是4,他的成绩是95
e的学号是3,他的成绩是91
2018.3–判断X年Y月Z日是该年的第几天
思路:
- 应该有判断该年是不是闰年的方法
- 对于Y月,Y-1个月的总天数需要计算
- 最后加上Z日,得到最后的结果
代码实现:
package Ayan;
import java.util.Scanner;
/**
* @Author: cc雪影
* @Description:
* @Date: Create in 12:06 2022/1/15
*/
public class A2018_03 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入年、月、日:");
int year = scanner.nextInt();
int montn = scanner.nextInt();
int day = scanner.nextInt();
System.out.println(year + "年" + montn + "月" + day + "日,是这一年的第 " + getNumber(year, montn, day) + " 天");
}
public static int getNumber(int year, int month, int day) {
boolean isRN = isRN(year);
int count = 0;
switch (month - 1) {//计算除当月以外,每个月的天数的和count
case 11:
count = count + 30;
case 10:
count = count + 31;
case 9:
count = count + 30;
case 8:
count = count + 31;
case 7:
count = count + 31;
case 6:
count = count + 30;
case 5:
count = count + 31;
case 4:
count = count + 30;
case 3:
count = count + 31;
case 2:
if (isRN) {
count = count + 29;
} else {
count = count + 28;
}
case 1:
count = count + 31;
break;
}
count = count + day;//再加上当月第day日的天数
return count;
}
public static boolean isRN(int year) {
boolean isRN = false;
//判断是否为闰年:能被4整除但不能被100整数,或者,能被400整除
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
isRN = true;
}
return isRN;
}
}
输入输出:
请输入年、月、日:
2018 9 23
2018年9月23日,是这一年的第 266 天
2018.4–小球分类(动态规划)
问题描述:
将N个小球放进M个相同的箱子里,没有顺序之分,问一共多少种方案
思路:
利用递归的思想不断把问题划分为若干子问题
- 第一个盒子,装X1个,第二个装X2个,第i个装Xi;其中X1>=X2>=…>=Xi 且X1+…Xbox=ball; ball 是球的数量;box 是箱子的数量,max 因为是一样的箱子和小球,为了规避123 321这样的序列,这里引入max变量
- 为了方便分析问题,这里要求越靠前的箱子放得球越多
- 采用选与不选的思想解决动态规划问题,这里直接使用递归完成,笔者能力有限,用数组存储进行优化的方案感兴趣可自行研究。
代码实现:
package Ayan;
/**
* @Author: cc雪影
* @Description:
* @Date: Create in 12:10 2022/1/15
*/
public class A2018_04 {
public static void main(String[] args) {
System.out.println(opt(200, 10, 200));//运行时间约12s
}
public static int opt(int ball, int box, int max) {
/**
* @description: 利用递归的思想不断把问题划分为若干子问题
* 第一个盒子,装X1个,第二个装X2个,第i个装Xi
* 其中X1>=X2>=...>=Xi
* 且X1+...Xbox=ball
* @param ball 球的数量
* @param box 箱子的数量
* @param max 因为是一样的箱子和小球,为了规避123 321这样的序列,这里引入max变量
* 要求越靠前的箱子放得球越多
* @createDate: 12/5/2021 11:38 AM
* @return: int
*/
//递归的出口
if (ball == 0 || ball == 1) {//当球的数量为0或1的时候,只有一种方案
return 1;
}
if (box == 1 && ball <= max) {//当箱子只剩一个,并且当前球数小于等于前面箱子装的球数,这时有一种方案
return 1;
}
if (box == 1 && ball > max) {//当箱子只剩一个,并且当前球数大于了前面箱子装的球数,这时方案冲突,返回0
return 0;
}
int OPT = 0;//计数辅助变量OPT
for (int i = 0; box > 0 && i <= (ball * (box - 1)) / box; i++) {//划分为子问题,i<=(ball * (box - 1)保证了第一个盒子球量的下限
if (max >= ball - i) {//保证前多后少的原则
OPT = OPT + opt(i, box - 1, ball - i);//更新OPT的值
}
}
return OPT;
}
}
输入输出:
(这里因为输入数据比较大,导致计算时间长达12秒,不过毕竟是递归实现,正常现象)
1212199424
2018年题目结束,这里是传送门:
西安交通大学915考研–编程题Java代码踩坑(2015年真题)
西安交通大学915考研–编程题Java代码踩坑(2016年真题)
西安交通大学915考研–编程题Java代码踩坑(2017年真题)