逆向思维的思考方式案例:
有时候在处理问题时可能很棘手,一时想不出好的方法,不妨反过来看看,下面的例子就是:
说明:程序中有个bug
package s01_javabasic.day06; import java.util.Scanner; public class GuessingGame { public static void main(String[] args) { //表示玩家猜测的次数 int count = 0; //用于保存判断的结果 int[] result = new int[2];//全都都对,字符对位置不对 Scanner scanner =new Scanner(System.in); System.out.println("GuessingGame>欢迎尝试猜字母游戏!"); //表示猜测的字符串 char[] chs = generate(); System.out.println(chs); System.out.println("GuessingGame>游戏开始,请输入你所猜的5个字母序列:(exit--退出)"); while(true){ String inputStr= scanner.next().trim().toUpperCase(); if("EXIT".equals(inputStr)){ System.out.println("GuessingGame>谢谢你的尝试,再见!"); break; } char[] input = inputStr.toCharArray(); // result = check(chs,input); if(result[0]==chs.length){//完全猜对的情况 int score = 100*chs.length-count*10; System.out.println("GuessingGame恭喜你猜对了!你的得分是"+score); break; }else{ count++; System.out.println("GuessingGame>你猜对"+result[1]+"个字符,其中" +result[0]+"个字符的位置正确!(总次数="+count+",exit--退出"); } } scanner.close(); } /** * 随机生成需要猜测的字母序列 * @return 存储随机字符的数组 */ private static char[] generate() { char[] letters = {'A','B','C','D','E','F','G','H','I','J', 'K','L','M','N','O','P','Q','R','S','T','U','V', 'W','X','Y','Z'}; boolean[] flags = new boolean[letters.length]; char[] chs = new char[5]; for(int i=0;i<chs.length;i++){ int index; do{ index = (int)(Math.random()*(letters.length)); }while(flags[index]);//判断生成的字符是否重复 chs[i] = letters[index]; flags[index] = true; } return chs; } /** * 比较玩家输入的字母序列和程序所生成的字母序列,逐一比较字符及其位置,并记载比较结果 * @param chs 程序生成的字符序列 * @param input 玩家输入的字符序列 * @return 存储比较的结果。返回值int数组 的长度为2 其中,索引为0的位置 * 用于存放完全猜对的字母个数(字符和位置均正确),索引为1的位置用于存放猜对的字母个数(字符正确,但是位置不正确) */ private static int[] check(char[] chs, char[] input) { int[] result = new int[2]; for(int i=0;i<input.length;i++){ for(int j=0;j<chs.length;j++){ if(input[i]==chs[j]){//判断字符是否正确 result[1]++; if(i==j){//判断位置是否正确 result[0]++;//次数累加 } break;//判断有一个字符相同,不再需要与其他字符比较,(5个字符不同) } } } return result; } /* * BUG解决:check方法中如果用户录入AAAAA ,程序随机字符序列ABCDE * 会输出5个字符对的问题 * 原因与解决: * 用户录入不可控可能会录入重复字符,导致取外层用户的每一个字符与内层比较时 * 会重复判断相同的字符,认为有多个字符相同 * 如果将程序随机字符序列作为外层就不会出现相同的字符 * 在与用户录入字符序列比较时就不出现以上问题。 * */ }
运行程序后测试BUG截图:
一个简单的例子说明下逆向思维的使用。大家若有其他好的例子可以交流交流!