一、设计并实现一个系统,让一个普通用户就能通过单步执行的方式看到你的算法是如何工作的
2.1 按 单步执行 键, 在 GUI 看到你的程序是如何一步一步算出目前最大子数组的范围,当前计算到的临时子数组是在哪里,等等。 最好用不同的颜色标识不同的状态。
2.2 按 自动运行 键, 在 GUI 看到程序自动运行,并自动显示过程, 每次改变状态的时候要稍作停留 (例如 1 秒钟的时间)
二、为实现2.1我使用了输入功能,关键代码如下
System.out.println("请按1继续"); Scanner input = new Scanner(System.in); String str = input.next();
三、为实现2.2我使用了线程休眠功能,关键代码如下
Thread.sleep(1000);
四、整个分步功能的实现,是在每次循环之后进行输出数据操作
package main; //1 2 3 4 5 1 2 3 4 //1 2 3 4 5 //最大子数组 //第几步 //由哪几个 import java.util.Arrays; import java.util.Scanner; public class main { public static void main(String[] args) throws Exception { int g=0,h=0,e=0; Scanner cin = new Scanner(System.in); int[] a = new int[5]; int[] b = new int[5]; int[] c = new int[5]; int r=(a.length+1)*a.length/2; for (int i = 0; i < a.length; i++) { a[i] = cin.nextInt(); } System.out.println("一维数组为"+Arrays.toString(a)); System.out.println("单步执行请按1,自动运行请按2"); e=cin.nextInt(); for (int j = 0; j < c.length; j++) { int sum = 0; for (int i = j; i < a.length; i++) { sum = a[i] + sum; b[i] = sum; System.out.println("第"+(++g)+"步:当前子数组的和为"+b[i]); System.out.println("已检查第"+(++h)+"个子数组,正在检索的范围是"+j+"~"+i+"还剩"+(r-h)+"个数组"); System.out.println(); if (e==1) { System.out.println("请按1继续"); Scanner input = new Scanner(System.in); String str = input.next(); } else { Thread.sleep(1000); } } int max = b[0]; int k=0; for (int i = j; i < b.length; i++) { if (max < b[i]) { max = b[i]; k=i; } } c[j] = max; System.out.println("第"+(++g)+"步:当前遍历范围最大子数组和为"+max); System.out.println("确定范围是"+j+"~"+k); System.out.println(); if (e==1) { System.out.println("请按1继续"); Scanner input = new Scanner(System.in); String str = input.next(); } else { Thread.sleep(1000); } } int max = c[0]; for (int i = 0; i < c.length; i++) { if (max < c[i]) { max = c[i]; } } System.out.println("最大子数组和为:" + max); } }
五、运行截图为:
(1)自动运行
(2)单步执行
六、遇到的困难及解决办法
困难:每次遇到这种算法题,思路不是很清晰,加上时间压力,头脑一片浆糊
解决办法:一张纸一支笔,在纸上枚举算法最基础的步骤,明确思路