我有一个包含10个整数值的数组。现在我想找出答案 第二高的数字。我不应该使用任何java API。一位采访者向我提出了这个问题。他想要逻辑。他的要求是,我不应该遍历整个元素。有没有办法在没有遍历的情况下实现结果? Travesing意味着遍历数组中的所有元素。我想了很久。最后我放弃了。如果有人可以解释,那就太好了。我还询问了排序。他不希望对数组进行排序。
答案 0 :(得分:10)
不,这完全不可能。如果您没有查看所有数据,则可能知道第二个最高值。
您不必排序所有数据,当然,这可能是您的面试官的意思 - 但您需要至少查看一次所有元素。每个元素都有可能改变结果,因此需要进行检查。
答案 1 :(得分:1)
如果你不至少看一次每个元素,你就无法知道答案。但是,如果您不关心,可以使用二进制搜索树:
在计算机科学中,二叉搜索树(BST)(有时也称为有序或有序二叉树)是基于节点的二叉树数据结构,具有以下属性:[1]
节点的左子树仅包含键小于节点键的节点。 节点的右子树仅包含键大于或等于节点键的节点。 左右子树也必须是二叉搜索树 资料来源:http://en.wikipedia.org/wiki/Binary_search_tree
你如何找到第二大元素?
从BST的形成方式来看,你知道最大的元素是最右边的元素(从根节点开始,带着正确的孩子,直到你无处可去)。
现在,如何识别第二大? 嗯,这可能不是最有效的方法,但让我们在案例中将其分解:
最大节点是树根并且没有子节点 - 没有第二大元素,因为树中只有一个节点
最大节点是树根(没有右子) - 第二大元素是左子树中最大的元素
最大的元素不是树根,而是叶子(有一个左子) - 第二大元素是他的左孩子
最大元素不是树根,是叶子(没有孩子) - 第二大元素是他的父母
我相信你现在可以找出模式和一个简单的算法:D
答案 2 :(得分:1)
我知道这已经得到了解答,但我在想这样的事情。
double maxVal = array[0];
for (int i=1; i < array.length; i++) {
if (array[i] > maxVal) {
maxVal = array[i];
}
}
从技术上讲,我不是遍历整个数组而是遍历n-1长度,因为我将第一个值分配给最大值。我确信还有其他方法,但这个看起来就像采访者可能想要的那样。
答案 3 :(得分:0)
逻辑非常简单,我已经在单个for循环中实现了这一点。
我正在给你我的程序,如果你想要算法,我也可以为你提供。
public static void main(String [] args){
int[] arr={0,12,74,56,2,63,45};
int f1=1,f2=0,temp=0;
int num=0;
for(int i=0;i<arr.length;i++){
num=arr[i];
if(f1<num)
{
temp=f1;
f1=num;
num=temp;
}
if(f2<num)
{
temp=f2;
f2=num;
num=temp;
}
}
System.out.println("First Highest "+f1+" Second Highest "+f2+" Third "+num);
}