题目背景
小明正在玩一个“翻硬币”的游戏。
题目描述
桌上放着排成一排的若干硬币。我们用 *
表示正面,用 o
表示反面(是小写字母,不是零),比如可能情形是 **oo***oooo
,如果同时翻转左边的两个硬币,则变为 oooo***oooo
。现在小明的问题是:如果已知了初始状态和要达到的目标状态,每次只能同时翻转相邻的两个硬币,那么对特定的局面,最少要翻动多少次呢?
输入格式
两行等长字符串,分别表示初始状态和要达到的目标状态,每行长度小于 10001000。
数据保证一定存在至少一种方案可以从初始状态和要达到的目标状态。
输出格式
一个整数,表示最小操作步数。
输入输出样例
输入 #1复制
********** o****o****
输出 #1复制
5
输入 #2复制
*o**o***o*** *o***o**o***
输出 #2复制
1
需要明确的一个事实就是只用按顺序遍历,并且左右都一样(只和最远的两个不同点所在的区间有关)。
import java.util.Scanner;public class Main {public static void main(String args[]) {String x,y;int num = 0;char a[] = new char[1000];char b[] = new char[1000];try (Scanner sc = new Scanner(System.in)) {x = sc.nextLine();y = sc.nextLine();}for(int i =0; i<x.length();i++) {a[i] = x.charAt(i);b[i] = y.charAt(i);}for(int i =0; i<x.length();i++) {if(a[i] == b[i]) {continue;}else {a[i+1] =(a[i+1]=='*' ?'o':'*') ;num++;}}System.out.println(num);
}
}
在这个代码里面
a[i+1] =(a[i+1]=='*' ?'o':'*') ;
整一个被依据条件赋予了'o'或者'?'。并且要比下面这个情况(我写的)好多了:
package 练习; import java.util.; public class 第一次
{ public static void main(String[] args) {Scanner scan = new Scanner(System.in);
StringBuilder str1 = new StringBuilder();StringBuilder str2 = new StringBuilder();
int m; for(int i = 1 ; i <= 1000; i++) {if(str1.charAt(i) != str2.charAt(i)) {if(str1.charAt(i) = '') str1.insert(i,'o');else str1.insert(i,'*');if(i < 1000 && str1.charAt(i + 1) == '*')str1.insert(i,'o');elsestr1.insert(i,'*');m++;i++;}} }
}
一句顶我好几句。
由此可见这种根据条件选择的非此即彼的判断选择要用a > b ? x:y;这样的三元语句。