这段输出语句执行了多少次?
How many times the output statement is excuted in this fragement?
片段是
for(int i=0;i<n;i++)
for(int j=n-1;j>=i;j--)
System.out.println(i + " " + j);
我的回答是,第一个i
,i=0
,内循环(int j=n-1;j>=0;j--)
会执行n次,第2个i
, i=1
,内循环会执行n-1次。而对于i
、i=n-2
的第(n-1)次,内循环会执行2次,对于i
、i=n-1
的最后一次,所以内部循环将执行1次。
将它们加在一起n+(n-1)+(n-2)+...+2+1=n(n+1)/2
。
但是教科书的答案是n(n-1)/2
,那我的答案有什么问题吗?
您基本上是在打印从 1 到 n 的 2 个数字的每个组合,而不考虑顺序的重要性和重复(相同的元素可以选择两次)。
有C(n,2) + n = n!/((n-2)!2!) + n = n(n-1)/2 + n = n(n+1)/2
个这样的可能性,其中n
是元素的个数。
- C(n,2) - 从 n 中选择 2 个元素,不重复
- n - 所有可能的重复项
你确定你的教科书的代码不是
for(int i=0;i<n;i++)
for(int j=n-1;j>i;j--)
...
这会给你 (n-1)n/2
根据它的答案。
如果不是,并且您的代码与书中完全一致,那么您是正确的 - 您只是选择了所有可能的替换对,所以它是 (n+1)n/2
片段是
for(int i=0;i<n;i++)
for(int j=n-1;j>=i;j--)
System.out.println(i + " " + j);
我的回答是,第一个i
,i=0
,内循环(int j=n-1;j>=0;j--)
会执行n次,第2个i
, i=1
,内循环会执行n-1次。而对于i
、i=n-2
的第(n-1)次,内循环会执行2次,对于i
、i=n-1
的最后一次,所以内部循环将执行1次。
将它们加在一起n+(n-1)+(n-2)+...+2+1=n(n+1)/2
。
但是教科书的答案是n(n-1)/2
,那我的答案有什么问题吗?
您基本上是在打印从 1 到 n 的 2 个数字的每个组合,而不考虑顺序的重要性和重复(相同的元素可以选择两次)。
有C(n,2) + n = n!/((n-2)!2!) + n = n(n-1)/2 + n = n(n+1)/2
个这样的可能性,其中n
是元素的个数。
- C(n,2) - 从 n 中选择 2 个元素,不重复
- n - 所有可能的重复项
你确定你的教科书的代码不是
for(int i=0;i<n;i++)
for(int j=n-1;j>i;j--)
...
这会给你 (n-1)n/2
根据它的答案。
如果不是,并且您的代码与书中完全一致,那么您是正确的 - 您只是选择了所有可能的替换对,所以它是 (n+1)n/2