我正在尝试解决CodeWars上的一个问题,我在数组中找到了最小的数字。这是我目前的代码:
public class SmallestIntegerFinder {
public int findSmallestInt(int[] args){
int smallest = args[0];
for(int i=1; i < args.length; ++i){
if(args[i] < args[0]){
smallest = args[i];
}
}
return smallest;
}
}
为什么这不起作用?但是当我将 if 语句中的 args [0] 更改为变量最小时,它可以正常工作。这两者有什么区别?他们都指向 args [0] 不是吗?
public class SmallestIntegerFinder {
public int findSmallestInt(int[] args){
int smallest = args[0];
for(int i=1; i < args.length; ++i){
if(args[i] < smallest){
smallest = args[i];
}
}
return smallest;
}
}
我正在使用的测试数组是:{78,56,232,12,11,43}
答案 0 :(得分:6)
因为args[0]
是数组中的第一个元素,而smallest
以第一个元素开始;它更新为下一个最小值(考虑3,1,2; 2小于3但1小于2)。您也可以使用Math.min(int, int)
之类的
public int findSmallestInt(int[] args) {
int smallest = args[0];
for (int i = 1; i < args.length; ++i) {
smallest = Math.min(smallest, args[i]);
}
return smallest;
}
答案 1 :(得分:3)
指定了args [0]中的值的最小值,它不是指向该内存位置的指针。改变最小值不会改变args [0]。因此,在你的循环中,你总是要比较args [0]而不是你到目前为止看到的最低值。
答案 2 :(得分:2)
它不一样,
在第一种情况下,您将最小值设为args [i],但再次与args [0]进行比较。 因此,比较的基础值永远不会更新。
在第二种情况下,您的基础值将更新为当前最小值并且您正在进行比较 有了它,所以你得到的总价值最低。
答案 3 :(得分:2)
使用java-8。
public static int findSmallestInt(int[] args){
return IntStream.of(args)
.min()
.getAsInt();
}
OR
public static int findSmallestInt(int[] args){
return IntStream.of(args)
.min()
.orElseThrow(IllegalArgumentException::new);
}
答案 4 :(得分:2)
其他答案已经向您解释了为什么您的代码(不)正常工作:在比较args[i] < args[0]
中,您总是与数组的第一个值进行比较。
一句话:如果你使用的是Java 8,那么有一些更具可读性的解决方案:
import java.util.stream.IntStream;
public class Test {
public static void main(String[] args) {
int[] array = {78,56,232,12,11,43};
int min = IntStream.of(array).min().getAsInt();
System.out.println("Minimum: "+min);
}
}
答案 5 :(得分:1)
您正在做的是将priceConflicts
的内容复制到args[0]
。 smallest
和arg[0]
与内存位置不同。
如果smallest
值小于smallest
,则在第一个代码块中更新i
的内容。更新0
只会更新该变量中的值,smallest
在第二个代码块中,您将args[0]
与smallest
中的值进行比较和更新。
您需要了解写args[i]
之类的内容时会发生什么。这为该变量分配了一部分新内存。运行代码int smallest
会将int smallest = 1
放入1
。
如果您有两个不同的变量,即使您编写smallest
,也会有两个不同的内存位置。所有这一切都是将内容从smallest = largest
复制到largest
。
当您复制对象而不是基本类型时,这可能会造成混淆
显然,在原语的情况下,值(例如smallest
)从一个变量复制到另一个变量。您最终会遇到1
和smallest = 1
的情况
说到物体,它有点不同。对于largest = 1
,Object smallest = new Object()
不会包含smallest
,而是Object
在内存中的位置。如果您现在执行Object
,则会复制位置,而不是实际对象。
如果您对此感兴趣,可以从我最喜欢的答案中了解更多相关信息:Is Java “pass-by-reference” or “pass-by-value”?
答案 6 :(得分:0)
这是因为在执行smallest = args[i];
时,您正在更新smallest
变量中的最小值,而不是args[0]
。
在第一个解决方案中,您要将数组中的每个值与args[0]
进行比较,但如果发现任何i
元素的值较小,则更新smallest
变量args[0]
。
如果您希望第一个代码段正常工作,则应更新args[0]
。
以下是更正后的代码段:
public class SmallestIntegerFinder {
public int findSmallestInt(int[] args) {
int smallest = args[0];
for(int i=1; i < args.length; ++i) {
if(args[i] < args[0]){
args[0] = args[i];
}
}
return args[0];
}
}
答案 7 :(得分:0)
问题是您正在与args [0]进行比较。你应该与较小的那些进行比较,这样如果有小于小的东西,它将是新的更小的:)
这应该有效:
public static int findSmallestInt(int[] args) {
int smallest = args[0];
for (int i = 1; i < args.length; ++i) {
if (args[i] < smallest ) {
smallest = args[i];
}
}
return smallest;
}
答案 8 :(得分:0)
其他答案告诉你为什么第一部分代码不起作用并提供了很多替代方案,但允许我准确分解代码中断的位置。我觉得这有助于避免类似的错误。
这是您的原始代码:
public class SmallestIntegerFinder {
public int findSmallestInt(int[] args){
int smallest = args[0];
for(int i=1; i < args.length; ++i){
if(args[i] < args[0]){
smallest = args[i];
}
}
return smallest;
}
}
以下是您的意见:
{78,56,232,12,11,43}
您的原始代码在某一点上完美无缺,但它最终会导致代码中断的比较args[i] < args[0]
。
当您的代码循环遍历数组时,某些时候smallest
包含正确的值11
。但由于11
不是数组中的最后一个元素,因此代码会对43
进行一次比较。由于您的比较始终与args[0] = 56
进行比较,因此您的代码会检查43
是否小于56
,因为它会覆盖smallest
43
,导致您得到错误的价值。
将比较更改为args[i] < smallest
可以避免此问题,因为循环的最后一次迭代现在会检查43
是否小于11
。因为它不是,所以函数返回正确的值11
。
答案 9 :(得分:0)
这是一个更简单的解决方案:
final List<Integer> myList = Arrays.asList(78,56,232,12,11,43);
int smallest = myList.stream()
.sorted()
.findFirst()
.get();
System.out.println("Smallest number is "+smallest);