又一算法题,简单又复杂,导师有特殊要求,会的教下

题目是在console输出如下图所示数字排列,我导师要求主体代码不能超过5行,又把我难倒了,各位码友专家看能不能教一下,java、c#、c、vb都行
不会的也可以留言,我们一起学习共同进步

img

不超过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);
            }

我导师的答案放出来啦****************************************

img

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