赛码网-翻转数组

 

import java.util.Scanner;
import java.util.Arrays;
public class Main {
    
    
    public static void main(String[] args)
    {
        Scanner scanner = new Scanner(System.in);
        //思路:对数据存放两个数组,一个存原始顺序,一个用来排序
        //目的是找到一个片段,将其翻转后数组成为递增序列
        while(scanner.hasNext())
        {
            int n = scanner.nextInt();
            int[] arr = new int[n];
            int[] copy = new int[n];
            for(int i = 0;i<n;i++)
            {
                arr[i] = scanner.nextInt();
                copy[i] = arr[i];
            }
            Arrays.sort(copy);
            //使用一个已经排好序的数组与原数据进行左右指针的比对,在左边/右边找到第一个不是递增的位置
            int left = 0,right = n-1;
            while(left<n && arr[left] == copy[left])
                left++;
            while(right>=0&&arr[right] == copy[right])
                right--;
            int i;
            //right-left即为需要改变顺序才能变成升序的片段
            for(i = 0;i<=right-left;i++)
            {
                //对其进行双端匹配,如果一个位置不同则直接跳出
                if(copy[left+i] != arr[right-i])
                    break;
            }
            if(i>right-left)//证明已经对比完子数组的全部,都一致
            {
                System.out.println("yes");
            }
            else {
                System.out.println("no");
            }
        }
    }
}

 

posted @ 2021-03-31 09:51  γGama  阅读(71)  评论(0编辑  收藏  举报