我有一个挑战是以最简单的方式使用for循环将7的倍数(非负数)打印到第50个倍数。
我提出了这个(忽略数据类型)
for(int i = 0; i <= 350; i += 7)
{System.out.println(i);}
另一个人想出了这个
for(int i=0;i <=50; i++)
{
System.out.println(7*i);
}
但是,我觉得这两个代码段可以进一步优化。如果它真的可以请告诉。一个优于另一个的优点/缺点是什么?
答案 0 :(得分:9)
如果您真的想要优化它,请执行以下操作:
System.out.print("0\n7\n14\n21\n28\n35\n42\n49\n56\n63\n70\n77\n84\n91\n98\n105\n112\n119\n126\n133\n140\n147\n154\n161\n168\n175\n182\n189\n196\n203\n210\n217\n224\n231\n238\n245\n252\n259\n266\n273\n280\n287\n294\n301\n308\n315\n322\n329\n336\n343\n350");
并且它是O(1)
:)
答案 1 :(得分:3)
第一个技术上执行较少的操作(没有乘法)。
第二个稍微更具可读性(7倍的50倍,7倍的倍数,最高350倍)。
可能无法进一步优化。
除非您愿意通过以下方式优化多个println
来电:
StringBuilder s = new StringBuilder();
for(int i = 0; i <= 350; i += 7) s.append(i).append(", ");
System.out.println(s.toString());
(IIRC println
相对昂贵。)
这已经达到了以简单为代价获得一点点优化的程度。
答案 2 :(得分:1)
理论上,您的代码更快,因为每个循环不需要少一个乘法指令。
但是,对System.out.println
的多次调用(以及整数到字符串的转换)将 dwarf 乘法所需的运行时间。要优化,使用StringBuilder
聚合字符串并输出整个结果(或在内存成为问题时输出结果)。
但是,在实际代码中,极不太可能成为瓶颈。 个人资料,然后优化。
答案 3 :(得分:0)
第二个功能是你得到的最好的: 为O(n)