本文共 3329 字,大约阅读时间需要 11 分钟。
思路:对于这种双方交替进行的题目还是理解不好,这个题目简单来说就是对数据结构的运用,比如采用ArrayList(由于操作会有插入的操作,如果用普通的数组的话不太容易控制大小,推荐使用动态数组或者链式的其他结构,而且由于操作的是char类型,所以泛型写成Character更方便操作)可以使用remove(0)直接移出首个元素,而indexOf可以找到指定元素,最巧妙的是lastindexOf()可以找到元素上一次出现的位置。基本逻辑就是双方交替,交替之前要完成数据的插入与删除,还要记录这次处理的数据temp。其中如果数据处理完后出现出现可取牌的情况,则需要完成补牌的过程。每次都要判断是否出现一方无牌的情况,以保证程序的终止。
import java.util.ArrayList;import java.util.Iterator;import java.util.Scanner;public class Main { static char temp; static boolean ok = true; static boolean flag = true; static ArrayLista = new ArrayList (); static ArrayList b = new ArrayList (); static ArrayList onging = new ArrayList (); public static void main(String[] args) { String str; Scanner input = new Scanner(System.in); //输入 str = input.next(); for (char cha : str.toCharArray()) { a.add(cha); } str = input.next(); for (char cha : str.toCharArray()) { b.add(cha); } //执行 while (ok) { if (flag) { ok = underway(a, onging); if(ok) { flag = sourse(flag, a, onging); } } else { ok = underway(b, onging); if(ok) { flag = sourse(flag, b, onging); } } } // 打印 if(flag){ Iterator it = b.iterator(); while (it.hasNext()) { System.out.print(it.next()); } } else { Iterator it = a.iterator(); while (it.hasNext()) { System.out.print(it.next()); } } } //出牌 public static boolean underway(ArrayList x, ArrayList onging) { temp = x.remove(0); onging.add(temp); // 如果其中一方没牌或者出现一次可赢局面(可以拿走牌的情况) if(x.size() == 0 && onging.lastIndexOf(temp) == onging.indexOf(temp)) { return false; } return true; } public static boolean sourse(boolean flag, ArrayList x, ArrayList onging) { if(onging.size() != 0) { // temp出现的位置更新说明,又出现了一个temp,取牌后继续执行;反之,没有出现相同的,下个人执行 if(onging.lastIndexOf(temp) == onging.indexOf(temp)) { return !flag; } int end = onging.indexOf(temp) - 1; // 将lastIndex---Index中间的添加到x中,同时从ongoing中移出 while (onging.size()-1 != end) { int onMax = onging.size()-1; x.add(onging.get(onMax)); onging.remove(onMax); } } return flag; }}
转载地址:http://lrjaf.baihongyu.com/