首页 > 代码库 > 中国电信翼支付2014编程大赛决赛之我的见解(如果有误,望指证)

中国电信翼支付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);					}					}}

 效果演示:

 

 

中国电信翼支付2014编程大赛决赛之我的见解(如果有误,望指证)