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

}

 效果演示:

 

 

posted @ 2014-12-18 13:02  UDLD  阅读(258)  评论(0编辑  收藏  举报