目录
题目
1208. 翻硬币 - AcWing题库https://www.acwing.com/problem/content/1210/
代码
import java.util.Scanner;
public class Main {
public static void main(String[] args){
//获取数据
Scanner input = new Scanner(System.in);
String original = input.nextLine();
char[] ori = original.toCharArray();
String target = input.nextLine();
char[] tar = target.toCharArray();
//计数
int count = 0;
for(int i = 0; i < tar.length; i++){
if(ori[i] != tar[i]){
flip(i,ori);
count++;
}
}
System.out.println(count);
}
//翻硬币
public static void flip(int index, char[] ori){
ori[index] = ori[index] == '*' ? 'o' : '*';
ori[index + 1] = ori[index + 1] == '*' ? 'o' : '*';
}
}
AC结果
思路:
刚拿到这道题,一眼过去确实懵。可是看了解析有了思路后发现,确实就是一道非常简单的简单题。关键就在于,看似需要经过很多翻硬币的操作,而且每次操作会同时翻转相邻两枚硬币。看似不确定的操作,实际上是确定的。简而言之,只要上一个操作确定了,那么下一个操作也随之确定。而第一个操作,只需要初始字符串与目标字符串对比即可确实是否需要“翻转”,而后续是否需要“翻转”也随之依次可以确定了。题目提到答案一定有解,所以甚至不需要考虑无解的情况。
一、获取数据
//获取数据
Scanner input = new Scanner(System.in);
String original = input.nextLine();
char[] ori = original.toCharArray();
String target = input.nextLine();
char[] tar = target.toCharArray();
将输入的初始字符串和目标字符串保存下来,然后将其转为数组类型方便后续遍历操作。
二、翻硬币
//翻硬币
public static void flip(int index, char[] ori){
ori[index] = ori[index] == '*' ? 'o' : '*';
ori[index + 1] = ori[index + 1] == '*' ? 'o' : '*';
}
按照题意,每次翻转操作都会将相邻的两个硬币翻转过来。若原来为【*】翻转后则为【o】,若原来为【o】翻转后则为【*】。因为需要翻转的是两个相邻的元素,因此不仅index位置的硬币需要翻转,index+1位置的硬币同样要经过上述翻转。
三、计数
//计数
int count = 0;
for(int i = 0; i < tar.length; i++){
if(ori[i] != tar[i]){
flip(i,ori);
count++;
}
}
System.out.println(count);
用一个int变量count来记录翻转了多少次。然后从第一个位置开始比对初始字符串与目标字符串是否相同,若相同则不需要进行翻转操作,若不相同则进行翻转操作。直到循环结束,则可以输出count的值。