题目是在console输出如下图所示数字排列,我导师要求主体代码不能超过5行,又把我难倒了,各位码友专家看能不能教一下,java、c#、c、vb都行
不会的也可以留言,我们一起学习共同进步
不超过5行?
那只能这样:
string[] strs = new string[] {" 1"," 121"," 12321"," 1234321","123454321", " 1234321", " 12321" , " 121" , " 1" };
foreach (var item in strs)
Console.WriteLine(item);
long item = 0, len = 9;//len只到5的话,定义为int就可以了
for (int i = 0; i < len * 2 - 1; i++)
{
item = i < len ? item * 10 + long.Parse("1".PadLeft(i * 2 + 1, '1')) : (item - long.Parse("1".PadLeft(((int)len * 2 - i - 1) * 2 + 1, '1'))) / 10;
Console.WriteLine(" ".PadLeft((int)len - (item.ToString().Length) / 2, ' ') + item);
}
我导师的答案放出来啦****************************************
for (int i = 1, x = 5, n = x - 1; i < x * 2; i++, n = Math.Abs(i - x))
{
Console.WriteLine(new string(' ', n) + Math.Pow((Math.Pow(10, x - n) - 1) / 9, 2));
}
主体语句只有两行,不但行数少,每行代码也算短,里面没有半个条件语句,也没有变量循环累加,更没有用到集合,除了前置空格,几乎没用到字符串操作,至于什么原理,我脑壳想破了都没搞清楚,听说是借日月星辰运行之理。
不论怎么样,我觉得各位的回复都很卖力,也很是聪明历害,但又不能全采纳了,也不能老是挂着不结贴,各位给点建议看采纳谁的答案好点
pow((pow(10,x-n)-1 )/9 ,2)); //n=4 ,1
//n=3 ,99/9=11, 11*11 = 121
//n=2 ,999/9=111,111*111 = 12321
//n=1 ,9999/9=1111,1111*1111 = 1234321
恕我直言,算法讲究的是复杂度,在这里讲行数,这样做的意义是什么?
JavaScript行不行
大括号也算吗?好吧,再精简一下。。。
long item = 0, len = 9;
for (int i = 0; i < len * 2 - 1; i++)
Console.WriteLine(" ".PadLeft((int)len - ((item = i < len ? item * 10 + long.Parse("1".PadLeft(i * 2 + 1, '1')) : (item - long.Parse("1".PadLeft(((int)len * 2 - i - 1) * 2 + 1, '1'))) / 10).ToString().Length) / 2, ' ') + item);
这样应该没5行了吧?
Java的 6行 压缩不下了 你可以参考下 看其他人有没更好的
for (int i = 1, j = 5; i < j * 2; i++) {
String str = String.join("", Collections.nCopies(Math.abs(i - j), " "));
for (int k = 1; k <= (j - Math.abs(j - i)) * 2 - 1; k++)
str += k > j - Math.abs(i - j) ? ((j - Math.abs(i - j)) * 2 - k) : k;
System.out.println(str);
}
供参考:
#include<stdio.h>
int main()
{
int i,j,l,m,pos,n;
char k;
scanf("%d",&n);
for(pos=l=0,m=n-1; m>=0; ++l<n?pos=l:pos=--m)
for(i=pos,j=0;j<=2*pos+1;i<n?i++:j++)
printf("%c",i<n?' ':(j<=pos)?(k=j+1+'0'):((--k)!='0'?k:'\n'));
return 0;
}
for i in range(1,6):
print(' '*(5-i),str(list(range(1,i+1))).replace(',','').replace('[','').replace(']','').replace(' ','')+str(list(range(i-1,0,-1))).replace(',','').replace('[','').replace(']','').replace(' ',''))
for i in range(2,6):
print(' '*(i-1),str(list(range(1,6-i+1))).replace(',','').replace('[','').replace(']','').replace(' ','')+str(list(range(6-i-1,0,-1))).replace(',','').replace('[','').replace(']','').replace(' ',''))
import re
lines = re.sub("[,\]\[']",'',str([' '*(5-i)+re.sub("[,\]\[ ]",'',str(list(range(1,i+1))))+re.sub("[,\]\[ ]",'',str(list(range(i-1,0,-1))))+'\n' for i in range(1,6)])).replace('\\n','\n').replace(' 1\n',' 1\n')
print(lines+re.sub("[,\]\[']",'',str([it+'\n' for it in lines.split("\n")][:-2][::-1])).replace('\\n','\n').replace(' 1',' 1'))
import re
print(re.sub("[,\]\[']",'',str([' '*(5-i)+re.sub("[,\]\[ ]",'',str(list(range(1,i+1))))+re.sub("[,\]\[ ]",'',str(list(range(i-1,0,-1))))+'\n' for i in range(1,6)])).replace('\\n','\n').replace(' 1\n',' 1\n')+re.sub("[,\]\[']",'',str([it+'\n' for it in re.sub("[,\]\[']",'',str([' '*(5-i)+re.sub("[,\]\[ ]",'',str(list(range(1,i+1))))+re.sub("[,\]\[ ]",'',str(list(range(i-1,0,-1))))+'\n' for i in range(1,6)])).replace('\\n','\n').replace(' 1\n',' 1\n').split("\n")][:-2][::-1])).replace('\\n','\n').replace(' 1',' 1'))
一条循环勉强实现,供参考:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i,j,k,n;
scanf("%d",&n);
for (k=j=1,i=1-n;j<2*n; i<=n-1 ? i++:(i=1-n,++j<=n?k++:k--, putchar('\n')))
printf(k > abs(i) ? "%-2d " : " ",k-abs(i));
return 0;
}
思路 就是 求坐标距离
一个循环 1 到(5 * 2-1)的平方(81)
计算距离,i / (5 * 2 -1)的到 x 坐标, i % (5 * 2 -1) 得到 y坐标,距离计算x,y分别与 中心点(4,4)的绝对距离只和,距离<5画 5-距离,否则画空格,+ y == (5 * 2 -2)? 换行符 : ""
然后就可以画出来了
除去定义input=5,4行代码可以搞定
1
121
12321
1234321
123454321
12345654321
1234567654321
12345654321
123454321
1234321
12321
121
1
//过分了小老弟
int input = 7;
for(int i = 0;i < Math.Pow(input*2-1,2);i++)
{
int x = i/(input*2-1);
int y = i%(input*2-1);
Console.Write((Math.Abs(input-1-x)+Math.Abs(input -1-y)<input ? (input -(Math.Abs(input -1-x) + Math.Abs(input-1-y))).ToString():" ") + (y == (input*2-2)?Environment.NewLine:""));
}
lines = "123454321"
for i in range(1,12):
print((' '*(6-i)+lines[:i]+lines[:i-1][::-1] if i < 6 else ' '*(i-6)+lines[:12-i]+lines[:12-i-1][::-1]))
lines = "123454321"
for i in range(1,10):
print((' '*(6-i)+lines[:i]+lines[:i-1][::-1] if i < 6 else ' '*(i-4)+lines[:10-i]+lines[:10-i-1][::-1]))
end_mark = 5
lines = ''.join([str(it) for it in range(1,end_mark+1)])
for i in range(1,end_mark*2):
print((' '*(end_mark-i)+lines[:i]+lines[:i-1][::-1] if i < end_mark+1 else ' '*(i-end_mark)+lines[:end_mark*2-i]+lines[:end_mark*2-i-1][::-1]))
再少用一个变量,供参考:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i,k,n;
scanf("%d",&n);
for (k=1,i=1-n;k!=0;i!=n?i++:(i=1-n,k!=n?k++:k=i,putchar('\n')))
printf(abs(k)>abs(i)?"%-2d ":" ",abs(k)-abs(i));
return 0;
}
csdn真是卧虎藏龙、高手云集,通过最近提问的看似简单、又觉复杂、好似复杂、其实又简单的两条算法题,我更深刻认识到山外有山楼外有楼,更是天外有天,各位码友也是勇跃参与、认真解答,实属可贵。
hi,大师们,又有新题出来啦,点我的头像,查看我的提问,欢迎你大显神通,谢谢
我明天也研究下算法看看
主页置顶博客,JAVA学习资料分享
有码友说,abs也可以说是判断句,然后我就把abs去掉了,好像也达到了要求,各位知道是什么原理吗?
for (int i = 1, x = 5, n = x - 1; i < x * 2; i++, n = (int)Math.Sqrt(Math.Pow(i - x,2)))
Console.WriteLine(new string(' ', n) + Math.Pow((Math.Pow(10, x - n) - 1) / 9, 2));
6
2021年最新整理,5000道校招常用面试题,包含leetcode,校招笔试题,面试题,算法题,语法题。每天(周日休息)持续更新中。。。
算法题
package Test;
public class CylinderTest {
public static void main(String[] args) {
int m, i, c, n = 5;
// 打印上半部分
for (i = 1; i <= n; i++) {
for (m = i; m < n; m++) {
System.out.print(" ");
}
for (c = 1; c <= i; c++) {
System.out.print(" " + c);
}
for (c = i - 1; c > 0; c--) {
System.out.print(" " + c);
}
System.out.println();
}
// 打印下半部分
for (i = 1; i <= n - 1; i++) {
for (m = 1; m <= i; m++) {
System.out.print(" ");
}
for (c = 1; c < n - i; c++) {
System.out.print(" " + c);
}
for (c = n - i; c > 0; c--) {
System.out.print(" " + c);
}
System.out.println();
}
}
}