这段输出语句执行了多少次?

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);

我的回答是,第一个ii=0,内循环(int j=n-1;j>=0;j--)会执行n次,第2个ii=1,内循环会执行n-1次。而对于ii=n-2的第(n-1)次,内循环会执行2次,对于ii=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