编程中思维方式——逆向思维案例

逆向思维的思考方式案例:

有时候在处理问题时可能很棘手,一时想不出好的方法,不妨反过来看看,下面的例子就是:

说明:程序中有个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截图:


一个简单的例子说明下逆向思维的使用。大家若有其他好的例子可以交流交流!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Coder_Boy_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值