我需要在列表中找到最小和最小的数字。
我可以使用单循环执行此操作吗? 此外,我们需要考虑两个多次出现的情况。
Ex:1。从列表[20,30,90,50]输出20,30 2.从列表[30,30,90,50]输出30,30
plz help
答案 0 :(得分:8)
我想鼓励你自己做功课并理解它背后的概念,所以我不会为你发布任何代码,但这里有一些事情可以指导你:
i <= smallest
和i <= secondSmallest
作为您的两个条件(而不是严格小于比较值)。答案 1 :(得分:0)
对不起,其实我没有整数列表。但我有对象列表。无论如何,感谢您的帮助。我希望以下代码可以正常工作
if (minimum==0 || obj.getValue() < minimum) {
second = minimum;
minimum= obj.getValue();
} else if (obj.getValue() < second || second==0) {
second = obj.getValue();
}
答案 2 :(得分:0)
伪代码只是因为它的功课,才能变成你选择的语言。假设列表中有两个或多个数字(索引0和1):
set lowest to value at index 0.
set second_lowest to value at index 1.
if lowest is greater than second_lowest:
swap lowest and second_lowest.
vary idx from 3 to last element:
if value at index idx is less than lowest:
set second_lowest to lowest
set lowest to value at index idx
else
if value at index idx is less than second_lowest:
set second_lowest to value at index idx
这基本上通过检查每个数字来查看它是否应该是新的最低或新的第二低数字。它可以在一个循环中完成。
你想要做的就是在头脑中运行这个程序,在纸上写下变量变为什么。这是了解计算机如何工作的好方法。请按照以下步骤考虑列表[30,20,90,10,50,12,7]
:
lowest second description
------ ------ -----------
30 20 store first two elements.
20 30 swap them if in wrong order (they are).
20 30 90 is not less than either so ignore.
10 20 10 is less than lowest (20) so move
lowest to second, store 10 to lowest.
10 20 50 is not less than either so ignore.
10 12 12 is less than second (20) so
store 12 to second.
7 10 7 is less than lowest (10) so move
lowest to second, store 7 to lowest.
答案 3 :(得分:0)
这可以使用BinarySearch以递归方式完成。 下面是一个BinarySearch找到最小的。它可以扩展到找到最小和最小的(锦标赛方法)。
public int findSmallest(int[] A, int start, int end){
if(end == start){
return A[start];
}else if(start == end-1){
return Math.min(A[start], A[end]);
}else{
int mid = start + (end-start)/2;
int min1 = findSmallest(A, start, mid);
int min2 = findSmallest(A, mid+1, end);
return Math.min(min1, min2);
}
}
这是找到第二小的方法。基本思路是在搜索大小为<=2
时返回最大值。其余的搜索返回min。
public static int findSecondSmallest(int[] A, int start, int end){
if(end == start){
return A[start];
}else if(start == end-1){
return Math.max(A[start], A[end]);
}else{
int mid = start + (end-start)/2;
int min1 = findSecondSmallest(A, start, mid);
int min2 = findSecondSmallest(A, mid+1, end);
return Math.min(min1, min2);
}
}
答案 4 :(得分:-1)
#include <stdio.h>
#include <limits.h> /* For INT_MAX */
/* Function to print first smallest and second smallest elements */
void print2Smallest(int arr[], int arr_size)
{
int i, first, second;
/* There should be atleast two elements*/
if(arr_size < 2)
{
printf(" Invalid Input ");
return;
}
first = second = INT_MAX;
for(i = 0; i < arr_size ; i ++)
{
/*If current element is smaller than first then update both
first and second */
if(arr[i] < first)
{
second = first;
first = arr[i];
}
/* If arr[i] is in between first and second then update second */
else if (arr[i] < second)
{
second = arr[i];
}
}
printf("The smallest element is %d and second Smallest element is %d",
first, second);
}
/* Driver program to test above function */
int main()
{
int arr[] = {12, 13, 15, 10, 35, 1};
print2Smallest(arr, 6);
getchar();
return 0;
}
答案 5 :(得分:-2)
调用Collections.min(),然后从列表中删除您获得的元素,然后再次调用它?
List<Integer> list = Arrays.asList(20, 30, 90, 50);
List<Integer> copy = new ArrayList<Integer>(list);
Integer smallest = Collections.min(copy); // 20
copy.remove(smallest);
Integer secondSmallest = Collections.min(copy); // 30
(制作副本不要弄乱原作。)
这可能远非最高性能的解决方案(来自Collections.min()Javadoc:“此方法遍历整个集合,因此需要时间与集合的大小成比例。”),但它非常简单写作和维护。 :)