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

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

2019.1–寻找包含所有点坐标的最小的矩形

问题描述:
接收若干形如(2,3)的点的坐标,输出包含所有点坐标的最小的矩形的左下和右上顶点坐标,特别的若只接收单个点的坐标,则输出这个点。
注:接收点的坐标以(0,0)作为结束。

思路:

  1. 考虑用数组存储每一个点,点集使用ArrayList<int[]> arrayList 来存储
  2. 接收点坐标完毕后,再遍历点集,找到minX,maxX,minY,maxY
  3. 最后,判断输出,如果输入的是单个点,则输出单个点,否则,输出左下和右上点的坐标

代码实现:

package Ayan;

import java.util.ArrayList;
import java.util.Scanner;

/**
 * @Author: cc雪影
 * @Description:
 * @Date: Create in 14:05  2022/1/16
 */
public class A2019_01 {
    public static int minX;
    public static int minY;
    public static int maxX;
    public static int maxY;
    public static ArrayList<int[]> arrayList = new ArrayList();

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (true) {
            //接收点的坐标
            String string = in.nextLine();
            if (string.equals("(0,0)")) {
                break;
            }
            int a[] = new int[2];
            String s[];
            string = change(string);
            s = string.split(",");
            //将点的坐标存进数组里
            a[0] = Integer.parseInt(String.valueOf(s[0]));
            a[1] = Integer.parseInt(String.valueOf(s[1]));
            arrayList.add(a);//将数组再放进arrayList,好处是可以添加任意多个节点,比较灵活
        }
        in.close();
        judgeAndOut();//判断并输出结果
    }

    public static String change(String s) {
        /**
         * @description: 将接收的字符串坐标,去除左括号和右括号
         * @param s
         * @createDate: 2022/1/16 14:07
         * @return: java.lang.String
         */
        StringBuffer stringBuffer = new StringBuffer();
        for (char a : s.toCharArray()) {
            if (a - '(' == 0 || a - ')' == 0) {
                continue;
            } else {
                stringBuffer.append(a);
            }
        }
        return stringBuffer.toString();
    }

    public static int getMax(int a, int b) {
        /**
         * @description: 返回两者中的较大者
         * @param a
         * @param b
         * @createDate: 2022/1/16 14:08
         * @return: int
         */
        if (a >= b) {
            return a;
        } else {
            return b;
        }
    }

    public static int getMin(int a, int b) {
        /**
         * @description:返回两者中的较小者
         * @param a
         * @param b
         * @createDate: 2022/1/16 14:09
         * @return: int
         */
        if (a <= b) {
            return a;
        } else {
            return b;
        }
    }

    public static void judgeAndOut() {
        /**
         * @description: 做输出的判断并输出结果
         * 如果输入的是单个点,则输出单个点,否则,输出左下和右上点的坐标
         * @createDate: 2022/1/16 14:09
         * @return: void
         */
        if (arrayList.size() == 1) {
            System.out.println("(" + arrayList.get(0)[0] + "," + arrayList.get(0)[1] + ")");
        } else {
            fun();
            System.out.print("(" + minX + "," + minY + ")" + "   ");
            System.out.print("(" + maxX + "," + maxY + ")");
        }
    }

    public static void fun() {

        /**
         * @description: 遍历arrayList,找到 minX,maxX,minY,maxY,即左下和右上点的坐标
         * @createDate: 2022/1/16 14:21
         * @return: void
         */
        minX = arrayList.get(0)[0];
        maxX = arrayList.get(0)[0];
        minY = arrayList.get(0)[1];
        maxY = arrayList.get(0)[1];
        for (int i = 1; i < arrayList.size(); i++) {
            minX = getMin(arrayList.get(i)[0], minX);
            minY = getMin(arrayList.get(i)[1], minY);
            maxX = getMax(arrayList.get(i)[0], maxX);
            maxY = getMax(arrayList.get(i)[1], maxY);
        }
    }
}

输入输出:

(2,7)
(4,1)
(3,0)
(9,8)
(8,10)
(0,0)
(2,0)   (9,10)

2019.2–回文串的检测(递归与非递归实现)

问题描述:
接收一个字符串,使用递归与非递归的方法分别判断其是否为回文。所谓回文字符串,是指从左到右读和从右到左读完全相同的字符串。主要涉及知识点:字符数组的输入输出,及相应的处理。

解题思路

  1. 非递归实现:可以从字符串的两头开始比较,即第1个字符和倒数第1个字符比较,第2个字符和倒数第2个字符比较,以此类推…如果出现字符不相等的情况,说明不是回文,如果全部相等,说明是回文。
  2. 递归实现:依次判断前后字符是否相等,相等则返回子问题(++low,–high),否则直接返回false

代码实现:

package Ayan;

import java.util.Scanner;

/**
 * @Description:
 * @Author: cc雪影
 * @Date:16:10 2022/1/17
 */
public class A2019_02 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String string = in.nextLine();
//        boolean s=isH("abba",0,3);
        System.out.println(isH(string, 0, string.length() - 1));
        System.out.println(isHui(string));
    }

    public static boolean isH(String string, int low, int high) {
        /**
         * @description: 递归依次判断前后字符是否相等,相等则返回子问题(++low,--high)
         * @param string
         * @param low
         * @param high
         * @createDate: 2022/1/17 16:09
         * @return: boolean
         */
        if (low >= high) {//如果low已经不再小于high,说明前面判断一直是成功的,因此是回文串
            return true;
        }
        if (string.charAt(low) - string.charAt(high) == 0) {//如果相等,就继续返回子问题
            return isH(string, ++low, --high);//先修改值,再传参
        } else {
            return false;//只要有一个字符前后不相等,就直接返回false退出递归
        }
    }

    public static boolean isHui(String string) {
        /**
         * @description: 回文串检测的非递归实现
         * low high 指针依次比较是否相等,不相等就返回false
         * 否则循环结束,返回true
         * @param string
         * @createDate: 2022/1/17 16:17
         * @return: boolean
         */
        for (int low = 0, high = string.length() - 1; low < high; low++, high--) {
            if (string.charAt(low) - string.charAt(high) != 0) {
                return false;
            }
        }
        return true;

    }

}

输入输出:

12gh76y67hg21
true
true

12gh7y67hg21
false
false

2019.3–求整数序列的逆序数

思路:

  1. 将整数序列进行归并操作,并计算交换次数
  2. 当发生交换时,逆序数增加,相当于后边的数往前拿,变成有序,逆序数增加mid-j+1
    代码实现:
package Ayan;

/**
 * @Description:
 * @Author: cc雪影
 * @Date:16:20 2022/1/17
 */
public class A2019_03 {
    public static int arr1[] = {3, 1, 4, 5, 2, 8, 7, 6};
    public static int array[] = new int[arr1.length + 1];//申请辅助数组
    public static int count = 0;//逆序数

    public static void main(String[] args) {
        System.out.print("原数组:");
        for (int a : arr1) {
            System.out.print(a + " ");
        }
        mergeSort(arr1, 0, arr1.length - 1);
        System.out.println();
        System.out.print("合并排序后:");
        for (int a : arr1) {
            System.out.print(a + " ");
        }
        System.out.println();
        System.out.println("原数组中的逆序对数是:" + count);
    }

    public static void merge(int arr[], int low, int mid, int high) {
        /**
         * @description:合并操作
         * @param arr  arr数组的两段A[low...mid],A[mid...high]是各自有序的
         * @param low
         * @param mid
         * @param high
         * @createDate: 2022/1/17 16:20
         * @return: void
         */
        for (int m = low; m <= high; m++) {//数组中的元素复制到辅助数组中
            array[m] = arr[m];
        }
        int i, j, k;
        for (j = low, i = low, k = mid + 1; j <= mid && k <= high; i++) {//不断选择最小值,如果条件不满足,循环结束
            if (array[j] <= array[k]) {
                arr[i] = array[j++];
            } else {
                arr[i] = array[k++];
                count = count + mid - j + 1;//当发生交换时,逆序数增加,相当于后边的数往前拿,变成有序,逆序数增加mid-j+1
            }
        }
        //循环结束,需要把未检测完的表复制到arr
        while (j <= mid) {
            arr[i++] = array[j++];
        }
        while (k <= high) {
            arr[i++] = array[k++];
        }
    }

    public static void mergeSort(int arr[], int low, int high) {
        /**
         * @description:归并排序
         * 递归形式的2路归并排序算法是基于分治的
         * @param arr
         * @param low
         * @param high
         * @createDate: 2022/1/17 16:21
         * @return: void
         */
        if (low < high) {
            int mid = (low + high) / 2;//从中间划分两个子序列
            mergeSort(arr, low, mid);//对左侧子序列进行递归排序
            mergeSort(arr, mid + 1, high);//对右侧子序列进行递归排序
            merge(arr, low, mid, high);//合并两个已排序的字表得到排序结果
        }//if
    }

}

输入输出:

原数组:3 1 4 5 2 8 7 6 
合并排序后:1 2 3 4 5 6 7 8 
原数组中的逆序对数是:7

2019年题目结束,这里是传送门:
西安交通大学915考研–编程题Java代码踩坑(2015年真题)
西安交通大学915考研–编程题Java代码踩坑(2016年真题)
西安交通大学915考研–编程题Java代码踩坑(2017年真题)
西安交通大学915考研–编程题Java代码踩坑(2018年真题)

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
西南交通大学的考研数据结构和C语言真题主要涵盖了数据结构和C语言的基本概念、常见算法和数据结构的应用,是考研复习中的重点和难点。 数据结构部分的真题主要涉及线性表、栈和队列、链表和树、图和排序等知识点。例如,可能会出现关于数组的插入、删除和查找操作以及对其时间复杂度的分析题目,还可能会要求设计和实现单链表、二叉树或图等数据结构,并进行相应的操作和应用。对于这些题目,考生需要熟悉各种数据结构的特点、使用方法和算法,能够分析算法的时间复杂度和空间复杂度,并灵活应用到实际问题中。 C语言部分的真题主要考察C语言的基本语法、指针和内存管理、函数和库等方面的知识。可能会出现关于函数的声明和定义、指针的使用、内存动态分配和释放等方面的题目。考生需要对C语言的语法、特性和常用库函数有一定的掌握,能够理解和分析C语言程序的执行过程和内存管理机制。 对于准备西南交通大学考研的考生来说,要复习数据结构和C语言,首先要掌握基础概念和常用算法和数据结构的原理和应用。其次,要多做真题和模拟题,加深对知识的理解和应用。同时,还要关注最新的考研动态和备考资料,及时调整和完善复习计划。通过系统的学习和不断的练习,相信考生一定能够顺利应对西南交通大学考研数据结构和C语言的考试。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值