阿里笔试题(2018.3)

两个相等长度字符串都由数字组成,每次只能进行交换操作或加一操作或减一操作,求出使两个字符串相等的最少操作数。

思路:

  1.两两判断交换之后操作少,还是不交换操作少。(不交换操作数为:对应数字差值的绝对值之和,交换的操作数为:交换之后对应数字差值的绝对值之和+1)

       2.如果交换可以减少操作数,把交换后的操作数与其它交换后的操作数比较,找到最小值,进行交换

       3.继续1步骤,直到不能交换为止

    4.算出交换操作和加减操作之和 打印

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
		String arr[]=bf.readLine().split(" ");
		int length=arr[0].length();
		int []number1=new int[length];
		int []number2=new int[length];
		for(int i=0;i<length;i++){
			number1[i]=Integer.parseInt(arr[0].substring(i,i+1));
			number2[i]=Integer.parseInt(arr[1].substring(i,i+1));
		}
		boolean flag;
		int count=0;
		while(true){
			flag=false;
			int a=-1;
			int b=-1;
			
			int min=Integer.MAX_VALUE;
			for(int i=0;i<length;i++){
				for(int j=0;j<length;j++){
					int temp1=Math.abs(number1[i]-number2[i]);
					int temp2=Math.abs(number1[j]-number2[j]);
					int temp3=Math.abs(number1[i]-number2[j]);
					int temp4=Math.abs(number1[j]-number2[i]);
					if(temp1+temp2>temp3+temp4+1){
						if(min>temp3+temp4+1){
							min=temp3+temp4+1;
							a=i;
							b=j;
							flag=true;
						}
					}
				}
			}
			if(flag==true){
				int temp=number1[a];
				number1[a]=number1[b];
				number1[b]=temp;
				count++;
			}else{
				break;
			}
		}
		for(int i=0;i<length;i++){
			count +=Math.abs(number1[i]-number2[i]);
		}
		System.out.println(count);
	}
}

  

posted @ 2018-03-17 11:11  王者峡谷的码农  阅读(12977)  评论(0编辑  收藏  举报