阿里笔试
题目一:
对于一个01字符串,每次只能任意交换两个元素,或者把0变成1,或者把1变成0,或者反转整个字符串。那么从A串变成B串至少需要多少步。
例子,1111000变成0010011至少需要3步。
思路 分别计算不翻转时,A为0,B为1的位数a,A为1,B为0的位数b,以及翻转之后A为0,B为1的位数c,A为1,B为0的位数d。最后的结果其实就是min(max(a,b),max(c,d)+1)。举个例子:max(a,b)=a,这意味着只要进行b次的交换,和a-b次的变换即可。反转之后一样的,但是需要加上反转的1。
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);//输入
String str=sc.nextLine();//获取字符串长度
int m=Integer.valueOf(str);
String str1=sc.nextLine();//获取第一个字符串
String str2=sc.nextLine();//获取第二个字符串
int a=0,b=0,c=0,d=0;
for(int i=0;i<m;i++){
//第一个字符串为1 第二个字符串为0的个数
if(str1.charAt(i)=='1'&&str2.charAt(i)=='0'){
a++;
}
//第一个字符串为0 第二个字符串为1的个数
if(str1.charAt(i)=='0'&&str2.charAt(i)=='1'){
b++;
}
//反转 第一个字符串为1 第二个字符串为0的个数
if(str1.charAt(i)=='1'&&str2.charAt(m-i-1)=='0'){
c++;
}
//反转 第一个字符串为0 第二个字符串为1的个数
if(str1.charAt(i)=='0'&&str2.charAt(m-1-i)=='1'){
d++;
}
}
System.out.println( Math.min(Math.max(a,b),Math.max(c,d)+1));
}
}