Java蓝桥杯题目——1264排个序

Posted on 2024-03-09 10:39  奇诺qwq  阅读(10)  评论(0编辑  收藏  举报

题目

 

思路:

1、输入数据

2、用冒泡排序将数组(下标为pj的)部分升序,

3、判断是否有前一个元素大于后一个元素(降序),有则返回false

注意:(1)数组p元素的取值不能大于数组a的长度,因为p元素是a的下标

(2)数组下标越界问题,使用i<a.length判断

(3)并非所有元素都要降序才返回false,只要有前一个元素大于后一个元素就返回false

 

import java.util.Arrays;
import java.util.Scanner;
public class MaoPaoDemo1 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        int[] a = new int[n];
        int[] p = new int[m];
        for (int i = 0; i < n; i++) {
            a[i] = sc.nextInt();
        }
        for (int i = 0; i < m; i++) {
            p[i] = sc.nextInt();
        }
        //对p进行排序(p的元素大小不可能超过a的长度)
        Arrays.sort(p);
        //只对数组a下标为p[]的元素进行升序排序,得到部分升序数组a
        for (int j = 0; j < m; j++) {
            int max = p[j]-1;
            int i = p[j];
            for (; i <= p[m - 1]&&i<a.length; i++)
                //前一个元素大于后一个元素就交换位置
                if (a[max] > a[i]) {
                    int t2 = a[max];
                    a[max] = a[i];
                    a[i] = t2;
                }

        }
        //f记录真假
        boolean f = true;
        //只要有一个元素大于后一个元素就返回false,退出循环
        for (int i = 0; i < a.length-1; i++) {
            if(a[i]>a[i+1]){ f=false;break;}
        }
        //这里是错误的,这里的条件太严格了,(此处是所有元素都降序才返回false)
//        for (int i = 0; i < n; i++) {
//            if (a[i] != arr[i]) {//若两次变换的数组有一个元素不相等,则代表true,跳出循环
//                f = true;
//                break;
//            } else {
//                f = false;
//            }
//        }
        if (f) System.out.println("YES");
        else System.out.println("NO");
    }
}