牛客网-腾讯编程校招真题 小Q的排序简单 java

这篇博客探讨了小Q自创的排序算法,该算法在每轮允许对序列前n-1或后n-1个数进行升序排列。博主分析了最少操作次数的情况,指出序列有序时返回0,min在最后且max在最前需3次,min在最前且max在最后只需1次,其他情况至少2次。文中提供了两种解题思路。
摘要由CSDN通过智能技术生成
题目:

小Q在学习许多排序算法之后灵机一动决定自己发明一种排序算法,小Q希望能将n个不同的数排序为升序。小Q发明的排序算法在每轮允许两种操作:

1、 将当前序列中前n-1个数排为升序

2、 将当前序列中后n-1个数排为升序

小Q可以任意次使用上述两种操作,小Q现在想考考你最少需要几次上述操作可以让序列变为升序。

思路:

操作是一个黑盒,不需要自己去实现排序,只是回答最少操作多少次才能排好序.

最少几次操作受最小值min,最大值max所在位置影响:

  • 序列有序返回0
  • min是最后一个数,max是第一个数,最少操作3次才能排好序
  • min是第一个数,max是最后一个数,最少操作1次才能排好序
  • 其他情况最少需要两次操作
解法1:
import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        int num = scanner.nextInt();
        int []raw = new int[num];
        int pre = 0, cur = 0;
        int max = Integer.MIN_VALUE, min = Integer.MAX_VALUE;
        boolean flag = false;
        for(int i = 0; i < num; i++){
            raw[i] = scanner.nextInt();
            cur = raw[i];
            max = Math.max(max,cur);
            min = Math.min(min,cur);
            if(i == 0){
                pre = cur;
            }else if(flag == false){
                if(pre > cur){
                    flag = true;
                }
                pre = cur;
            }
        }
        
        if(flag == false){
            System.out.println(0);
        }else if(max == raw[0] && min == raw[num-1]){
            System.out.println(3);
        }else if(min == raw[0] || max == raw[num-1]){
            System.out.println(1);
        }else{
            System.out.println(2);
        }
    }
}
解法2:
import java.util.Scanner;
import java.util.Arrays;
public class Main{
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        int num = scanner.nextInt();
        int []raw = new int[num];
        int []sorted = new int[num];
        boolean flag = false;
        for(int i = 0; i < num; i++){
            raw[i] = scanner.nextInt();
            sorted[i] = raw[i];
        }
        Arrays.sort(sorted);
        for(int i = 0; i < num; i++){
            if(sorted[i] != raw[i]){
                flag = true;
            }
        }
        if(flag == false){
            System.out.println(0);
        }else if(sorted[num-1] == raw[0] && sorted[0] == raw[num-1]){
            System.out.println(3);
        }else if(sorted[0] == raw[0] || sorted[num-1] == raw[num-1]){
            System.out.println(1);
        }else{
            System.out.println(2);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值