中国电信翼支付2014编程大赛决赛
如果有误,希望可以给我留言,谢谢。
题目详情(只限Java)
给定一串整数,你只能进行两种操作:任选一个整数放到这串数之前,或者这串之后。所有的整数都不相等。
问把这串整数变为由小到大的排好序最少需要的操作次数。
输入格式:
多组数据,每组数据1行,包含若干个空格分隔的非负整数,每个整数不超过2147483647。
输出格式:
每组数据输出一行包含一个整数,表示需要最少操作的次数。
答题说明
输入样例
1 2 3
1 4 2
10 2 1
输出样例:
0
1
2
算法解析:
长度即原数组的(子序列)和排好序的数组的(连续子序列)相同的序列的最长长度。
import java.util.Scanner; public class Paixu { public static void main(String[] argv ){ Scanner br =new Scanner(System.in); String[] k; k = new String[100]; int num=0; // 获取多行输入 数字间用空格隔开 行数小于100 do { k[num] = br.nextLine(); if (k[num].equals("")) { break; } num++; } while(true); br.close(); for(int i=0;i<num;i++){ int max=1; String[] sf=k[i].split(" "); int[] s,e; s=new int[sf.length]; e=new int[sf.length]; // 把获取的每一行字符转化成int数组 e[] s[];两个数组相同。 for(int m=0;m<sf.length;m++){ s[m]=Integer.parseInt(sf[m]); e[m]=Integer.parseInt(sf[m]); } //冒泡排序 数组s[] for(int j=0;j<sf.length-1;j++){ for(int p=0;p<sf.length-1-j;p++){ if(e[p]>e[p+1]) { int tmp=e[p]; e[p]=e[p+1]; e[p+1]=tmp; } } } //把排好序的数组 e[]每个值在原数组s[]中的序号 赋给自己 for(int j=0;j<sf.length;j++){ for(int p=0;p<s.length;p++){ if(e[j]==s[p]) { e[j]=p; break; } } } int temp=1; //把e[]中的最长连续增长序列的长度 赋给 max for(int j=0;j<e.length-1;j++){ if(e[j+1]>e[j]) temp++; else temp=0; if(temp>max) max=temp; } int out=e.length-max; System.out.println("The minimum change: "+out); } } }
效果演示: