2020科大讯飞提前批笔试

2020科大讯飞提前批笔试

1.键盘录入1,5,10,50,100元钞票的数量abcde,再录入总金额k,怎么样才能用最少的钞票凑够k元,输出所需钞票数目,凑不出来输出-1

import java.util.Scanner;
public class Test6 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int moeny[] = {1,5,10,50,100};
        int[] a = new int[5];
        int count = 0;
        for(int i = 0;i < a.length;i++){
            a[i] = sc.nextInt();
        }
        int  k = sc.nextInt();

        //贪心,尽可能去用大面额优先,先把大面额用完这样钞票会少
        for(int i = 4;i >= 0;i--){
            //先把大面额用完,100,50,5,1
            while(k >= moeny[i] && a[i] > 0){
                k -= moeny[i];
                a[i] -= 1;
                count++;
            }
        }
        if(k == 0){
            System.out.println(count);
        }else {
            System.out.println(-1);
        }
    }
}

2.用某种排序方法对给定序列进行排序,输出排序过程。
例子:先从键盘读取序列的长度,再读入序列 25 84 21 47 15 27 68 35 20 ,其排序过程如下:
15 20 21 25 47 27 68 35 84
15 20 21 25 47 27 68 35 84
15 20 21 25 47 27 68 35 84
15 20 21 25 35 27 47 68 84
15 20 21 25 27 35 47 68 84
15 20 21 25 27 35 47 68 84

经典快排:以一个数为基准值,比其小的放左边,比其大的放右边,再对左右用相同手段递归排序
第一次以25为分割基准:15 20 21 25 47 27 68 35 84
第二次对25左边递归以15为基准:15 20 21 25 47 27 68 35 84
第三次:对15左边递归没有,对其右边递归,以20为基准:
15 20 21 25 47 27 68 35 84
第四次:25左边递归完毕,递归25的右边,第一趟以47为基准:15 20 21 25 35 27 47 68 84
第五次:递归右半部分47的左边:15 20 21 25 27 35 47 68 84
第六次:15 20 21 25 27 35 47 68 84
这里中轴值取得是最左边

import java.util.Scanner;
import java.util.Arrays;
public class Main{
	public static void main(String[] args){
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int[] arr = new int[n];
		for(int i = 0;i < n;i++){
			arr[i] = sc.nextInt();
		}
		System.out.println(Arrays.toString(QuickSort(arr,0,arr.length - 1)));
	}
	//快速排序
public static int[] QuickSort(int[] arr,int left,int right){
    if(left < right){
        int pivot = partition(arr,left,right);
        //左递归
        QuickSort(arr,left,pivot - 1);
        //右递归
        QuickSort(arr,pivot + 1,right);

    }
    return arr;

}
//将数组整理成有序数组,使左边所以都比基准值小,右边均比基准值大,并且返回排列后基准值索引
public static int partition(int[] arr,int left,int right){
    //取第一个作基准值
    int key = arr[left];
    while(left < right){
        //找到比基准值小的跳出,把比基准值小的放左边
        while(left < right && arr[right] >= key){
            --right;
        }
        arr[left] = arr[right];
        //大的放右边
        while(left < right && arr[left] <= key){
            ++left;
        }
        arr[right] = arr[left];
    }
    //基准值插入中间
    arr[left] = key;
    return left;
}

}

3.判断两个矩形是否相交,输入为两个矩形对角线的顶点坐标,相交输出1,不相交输出0
示例输入
0 0 4 3 0 1 5 2
意思:第一个矩形对角线顶点(0,0)(4,3),第二个矩阵对角线顶点(0,1)(5,2)

import java.util.Scanner;
public class Test6 {
    public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
        int[] rec1 = new int[4];
        int[] rec2 = new int[4];
        boolean flag = false;
        int[] temp = new int[8];
        for(int i = 0;i < temp.length;i++){
            temp[i] = sc.nextInt();
        }
        //这里做处理保证输入的坐标是左上右下顺序
        if(temp[0] > temp[2]){
            int a = temp[0];
            int b = temp[1];
            temp[0] = temp[2];
            temp[1] = temp[3];
            temp[2] = a;
            temp[3] = b;
            
        }
        if(temp[4] > temp[6]){
            int a = temp[4];
            int b = temp[6];
            temp[4] = temp[5];
            temp[5] = temp[7];
            temp[6] = a;
            temp[7] = b;
        }
        for(int i = 0;i < rec1.length;i++){
            rec1[i] = temp[i];
        }
        for(int i = 0;i < rec2.length;i++){
            rec2[i] = temp[i + 4];
        }
        flag = isXJ(rec1,rec2);
        if(flag){
            System.out.println(1);
        }else{
            System.out.println(0);
        }
        
   }

    /**
     * 
     * @param rec1 第一个矩形左上右下坐标
     * @param rec2 第二个矩形左上右下坐标
     * @return
     */
    public static boolean isXJ(int[] rec1,int[] rec2){
        boolean flag = false;
        flag = (long)(rec2[2] - rec1[0]) * (rec2[0] - rec1[2]) <= 0 &&
                (long)(rec2[3] - rec1[1]) * (rec2[1] - rec1[3]) <= 0;
        return flag;
    }
}




方法二:用质心判断
import java.util.Scanner;;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int[] temp = new int[8];
        for (int i = 0; i < temp.length; i++) {
            temp[i] = sc.nextInt();
        }
        int x1 = temp[0];
        int y1 = temp[1];
        int x2 = temp[2];
        int y2 = temp[3];
        int x3 = temp[4];
        int y3 = temp[5];
        int x4 = temp[6];
        int y4 = temp[7];

        double barycenter_x1 = (x1 + x2) / 2.0;
        double barycenter_y1 = (y1 + y2) / 2.0;
        double barycenter_x2 = (x3 + x4) / 2.0;
        double barycenter_y2 = (y3 + y4) / 2.0;

        /* 若两质心的距离小于临界值则相交 */
        if (Math.abs(barycenter_x1 - barycenter_x2) <= (Math.abs(x1 - x2) + Math.abs(x3 - x4)) / 2.0 &&
                Math.abs(barycenter_y1 - barycenter_y2) <= (Math.abs(y1 - y2) + Math.abs(y3 - y4)) / 2.0)
        {
            System.out.println(1);;
        }else {
            System.out.println(0);
        }

    }


}

4.给一串字符串,输出里面的数字,尽可能考虑异常输入
示例
输入:+a13
输出:13

import java.util.Scanner;
public class Test6 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        str.replace(" ","");
        StringBuffer res = new StringBuffer();
        for(int i = 0;i < str.length();i++){
        	if(str.charAt(i) == '-'){
				res.append(str.charAt(i))
			}
            if('0' <= str.charAt(i) && str.charAt(i) <= '9'){
                res.append(str.charAt(i));
            }
        }
        System.out.println(res.toString());
    }
}



你可能感兴趣的:(2020科大讯飞提前批笔试)