阿里笔试题(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);
}
}


浙公网安备 33010602011771号