看到的一个JAVA面试题. 简单的思考, 有点意思.

原文是这个. 讲的一个很简单的题目.

http://www.iteye.com/topic/787888


我想到一个更简单一点的方法.

启发就是比较连续2组数的时候只需要比较有差别的那2个. 比如:

数据下标 0 1 2 和 1 2 3 比较的时候只需要比较 下标0 和下标3 的大小即可. 这样比较的次数是原来的1/3.

通过对其它的情况都考虑以后发现可以取一个基准点, 和一个差额, 当然必不可少的一个最大组合的下标.

实现的代码如下.

public class Test {

/**
* @param args
*/
public static void main(String[] args) {
int[] arr = { 2, 5, -6, 12, 7, 15, 6, -10, 38 };
Test.find(arr);
}

public static void find(int[] data) {
/**
* make sure the length of data more than or equal 5;
*/
if (data.length <= 5)
return;

/**
* difference between current comparing data subscript
* and max subscript of data
*/
int diff = 0;

/**
* index of max subscript of data, can also be
* a array to record max combinations.
*/
int maxIdx = 0;

for (int i = 1; i < data.length - 2; i++) {

int bigger = data[i - 1] - data[i + 2];

if (diff + bigger > 0) {

diff += bigger;

} else {
maxIdx = i;
diff = data[i - 1] - data[i + 2];
}
}

System.out.println("maxIndex : " + maxIdx + ", data : " + data[maxIdx]
+ ", " + data[maxIdx + 1] + ", " + data[maxIdx + 2] + ". ");
}
}



benchmark 了一下. 速度比原来的实现要快一点. 100 000次 1515ms 比2406ms
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值