当前位置:   article > 正文

编程中思维方式——逆向思维案例_程序逆向的例子素材

程序逆向的例子素材
逆向思维的思考方式案例:

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

说明:程序中有个bug

  1. package s01_javabasic.day06;
  2. import java.util.Scanner;
  3. public class GuessingGame {
  4. public static void main(String[] args) {
  5. //表示玩家猜测的次数
  6. int count = 0;
  7. //用于保存判断的结果
  8. int[] result = new int[2];//全都都对,字符对位置不对
  9. Scanner scanner =new Scanner(System.in);
  10. System.out.println("GuessingGame>欢迎尝试猜字母游戏!");
  11. //表示猜测的字符串
  12. char[] chs = generate();
  13. System.out.println(chs);
  14. System.out.println("GuessingGame>游戏开始,请输入你所猜的5个字母序列:(exit--退出)");
  15. while(true){
  16. String inputStr= scanner.next().trim().toUpperCase();
  17. if("EXIT".equals(inputStr)){
  18. System.out.println("GuessingGame>谢谢你的尝试,再见!");
  19. break;
  20. }
  21. char[] input = inputStr.toCharArray();
  22. //
  23. result = check(chs,input);
  24. if(result[0]==chs.length){//完全猜对的情况
  25. int score = 100*chs.length-count*10;
  26. System.out.println("GuessingGame恭喜你猜对了!你的得分是"+score);
  27. break;
  28. }else{
  29. count++;
  30. System.out.println("GuessingGame>你猜对"+result[1]+"个字符,其中"
  31. +result[0]+"个字符的位置正确!(总次数="+count+",exit--退出");
  32. }
  33. }
  34. scanner.close();
  35. }
  36. /**
  37. * 随机生成需要猜测的字母序列
  38. * @return 存储随机字符的数组
  39. */
  40. private static char[] generate() {
  41. char[] letters = {'A','B','C','D','E','F','G','H','I','J',
  42. 'K','L','M','N','O','P','Q','R','S','T','U','V',
  43. 'W','X','Y','Z'};
  44. boolean[] flags = new boolean[letters.length];
  45. char[] chs = new char[5];
  46. for(int i=0;i<chs.length;i++){
  47. int index;
  48. do{
  49. index = (int)(Math.random()*(letters.length));
  50. }while(flags[index]);//判断生成的字符是否重复
  51. chs[i] = letters[index];
  52. flags[index] = true;
  53. }
  54. return chs;
  55. }
  56. /**
  57. * 比较玩家输入的字母序列和程序所生成的字母序列,逐一比较字符及其位置,并记载比较结果
  58. * @param chs 程序生成的字符序列
  59. * @param input 玩家输入的字符序列
  60. * @return 存储比较的结果。返回值int数组 的长度为2 其中,索引为0的位置
  61. * 用于存放完全猜对的字母个数(字符和位置均正确),索引为1的位置用于存放猜对的字母个数(字符正确,但是位置不正确)
  62. */
  63. private static int[] check(char[] chs, char[] input) {
  64. int[] result = new int[2];
  65. for(int i=0;i<input.length;i++){
  66. for(int j=0;j<chs.length;j++){
  67. if(input[i]==chs[j]){//判断字符是否正确
  68. result[1]++;
  69. if(i==j){//判断位置是否正确
  70. result[0]++;//次数累加
  71. }
  72. break;//判断有一个字符相同,不再需要与其他字符比较,(5个字符不同)
  73. }
  74. }
  75. }
  76. return result;
  77. }
  78. /*
  79. * BUG解决:check方法中如果用户录入AAAAA ,程序随机字符序列ABCDE
  80. * 会输出5个字符对的问题
  81. * 原因与解决:
  82. * 用户录入不可控可能会录入重复字符,导致取外层用户的每一个字符与内层比较时
  83. * 会重复判断相同的字符,认为有多个字符相同
  84. * 如果将程序随机字符序列作为外层就不会出现相同的字符
  85. * 在与用户录入字符序列比较时就不出现以上问题。
  86. *
  87. */
  88. }
运行程序后测试BUG截图:


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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/505238
推荐阅读
相关标签
  

闽ICP备14008679号