如何验证自己代码的正确性?

在编程中,确保代码正确性至关重要。本文介绍了通过对比绝对正确的方法、创建随机输入、确保相同输入及编写判断函数来验证代码的方法。以冒泡排序为例,详细阐述了这一过程,提供了实际操作的思路和示例。

很多时候,我们写的代码虽然能够通过我们自己手动输入的样例,但是这段代码的正确性还是有待考究的。比如,当你在一些Online Judge的网站上敲题时,可能写的解决办法能够完美解决样例给出的输入,并给出正确输出,但是提交之后还是会wa。有时候可能是因为没有考虑边界问题,有时候可能是贪心算法有问题。这时候就应该模拟一下大数据量的输入来验证一下自己代码的正确性。思路如下:(拿简单的冒泡排序为例)

1.一个绝对正确的方法作为参考

拿排序方法举例,我们可以调用Java所提供的Arrays.sort函数作为绝对正确的方法,保证我们有正确的参考。其他的问题我们就可以写一些虽然暴力,时间复杂度高或者空间复杂度高的方法,只要它绝对正确就可以。

	public static void comparator(int[] arr) {
		Arrays.sort(arr);
	}

2.能够产生随机输入的函数

拿排序方法举例,我们只要写出一个能产生随机数组并赋值我们想要的随机数值的函数就可以。要保证产生的输入是随机的,可以帮我们查错就可以。当然,有的题目的输入很复杂,所以产生输入的函数也会变得复杂。

	public static int[] generateArrayRandom(int maxSize, int maxValue) {
		int size = (int) (Math.random() * (maxSize + 1));
		int arr[] = new int[size];
		for (int i = 0; i < arr.length; i++) {
			arr[i] = (int) (Math.random() * (maxValue + 1));//这里写的是随机非负数,产生全体随机数可以写成两个随机数相减的形式
		}
		return arr;
	}

3.确保两个函数的输入完全相同

对于排序方法来说,我们需要给我们的完全正确的方法以及我们自己写的排序方法完全一样的输入,这样才可能有完全按相同的输出。所以这里我们应该写的是一个拷贝数组的函数,对于其他的输入来说也只要保证能复制出完全相同的输入即可。

	public static int[] arrayCopy(int[] arr) {
		if (arr == null) {
			return null;
		}
		int[] res = new int[arr.length];
		for (int i = 0; i < arr.length; i++) {
			res[i] = arr[i];
		}
		return res;
	}

4.判断是否正确函数

对于排序方法而言,我们就需要写一个比较函数比较同样的数组经过一个完全正确的处理,和我们自己写的方法的处理之后的结果是否完全一致。简单来说,就是判断我们得到的结果是否是完全正确的。

public static boolean isRight(int[] arr1, int[] arr2) {
		if (arr1 == null && arr2 != null) {
			return false;
		}
		if (arr2 == null && arr1 != null) {
			return false;
		}
		if (arr1 == null && arr2 == null) {
			return true;
		}
		if (arr1.length != arr2.length) {
			return false;
		}
		boolean ans = true;
		for (int i = 0; i < arr2.length; i++) {
			if (arr1[i] != arr2[i]) {
				ans =false;
				break;
			}
		}
		return ans;
	}	

最后附上一个判断冒泡排序是否正确的Main函数作为例子。才疏学浅,若有错误之处希望大家多多指出,一定虚心接受。

public static void main(String[] args) {
		
		int testTime = 10000;  //设置试验次数
		int maxValue = 2000;  //产生的数组值的最大值
		int maxSize = 2000;  //产生的数组的最大size
		boolean isRight = true;
		for(int i=0;i<testTime;i++) {
			int [] arr1 = generateArrayRandom(maxSize, maxValue); //产生随机输入
			int [] arr2 = arrayCopy(arr1);//确保两个输入完全相同
			bubbleSort(arr1);
			comparator(arr2);
			isRight = isRight(arr1, arr2);
			if (!isRight) {
				break;
			}
		}
		System.out.println(isRight?"Right!":"Wrong!");
	}
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值