西安交通大学915考研--编程题Java代码踩坑(2018年真题)

西安交通大学915考研–编程题Java代码踩坑(2018年真题)

2018.1–统计字符串中每种字符的个数

思路:

  1. 考虑使用哈希表存储每种字符
  2. 遇到哈希表里没有的字符,放进哈希表,初始值为1;
  3. 遇到哈希表里有的字符,更新对应键的值
  4. 遍历输出哈希表
    代码实现:
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–对象化数据的排序

思路:

  1. 创建一个类Student,设置公共属性,姓名:String Name;学号,int No;成绩, int grade
    使用。并构造对应的get set方法,方便进行对象数据操作。
  2. 通过Scanner类接收输入的数据,存储到Student数据类型的实体对象中,特别注意,要使用前要先对Student类型数据进行存储空间的分配(即用new方法给Student类型的数组元素进行分配空间,这是因为Student不是基本数据类型)。
  3. 通过冒泡排序对数据类型的元素以成绩为关键字进行排序,对应的要把学号和姓名这些属性对应的做相同操作。
  4. 遍历输出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日是该年的第几天

思路:

  1. 应该有判断该年是不是闰年的方法
  2. 对于Y月,Y-1个月的总天数需要计算
  3. 最后加上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
2018923日,是这一年的第 266

2018.4–小球分类(动态规划)

问题描述:
将N个小球放进M个相同的箱子里,没有顺序之分,问一共多少种方案
思路:
利用递归的思想不断把问题划分为若干子问题

  1. 第一个盒子,装X1个,第二个装X2个,第i个装Xi;其中X1>=X2>=…>=Xi 且X1+…Xbox=ball; ball 是球的数量;box 是箱子的数量,max 因为是一样的箱子和小球,为了规避123 321这样的序列,这里引入max变量
  2. 为了方便分析问题,这里要求越靠前的箱子放得球越多
  3. 采用选与不选的思想解决动态规划问题,这里直接使用递归完成,笔者能力有限,用数组存储进行优化的方案感兴趣可自行研究。

代码实现:

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年真题)

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值