中国电信翼支付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);
}
}
}
效果演示:


浙公网安备 33010602011771号