2016-06-18 105 views
1

我有这个奇怪的问题,在那里我应该创建以下模式创建一个特定的模式,没有嵌套循环

** 
* 
* 
*** 
** 
** 
* 

使用单一for循环,但问题是我根本不准使用条件语句像if/else甚至Array

我能想到的打印这种模式被存储在一个变量对于整个图案,然后打印的唯一方法,但这种方法使得for循环无用的执行,除非我创建了两个不同的变数,打破轻拍燕鸥分为两部分,然后使用for循环打印他们两个,但这种方法相当糟糕。

有人可以告诉我怎么可以使用for循环使用automatic的方法来实现,而不是将它们存储在变量中?

P.S:这是一个面试挑战提出的挑战。

编辑:我也被告知使用任何我想要的过程语言。

+0

你4作为最后一个值,而不是1。需要在控制台中打印?你需要打印多少次这种模式,它是一个参数吗?你提出的例子是结果序列的开始还是中间部分? –

+0

除了一张印有上述图案的纸张以及说明不使用if语句数组或哈希表,并且仅使用一个for循环打印它的指示之外,没有提供其他细节。就这样。 –

+0

这对于[Code Golfing](http://codegolf.stackexchange.com/)来说是一个很大的难题。 –

回答

1

这是一个win_wave解决方案的变种,更容易理解和实现在纸上。这里唯一复杂的部分是pattern变量的计算,它构建了将位数转换为数字,将它们组合为半字节并最终转换为单个十六进制字(请参见示例代码中的注释)。

public class Test 
{ 
    // Pattern 1 2 2 3 1 1 2 
    // Bin  01 10...10 11...01 01...10 
    // Bin  01 1010  1101  0110 
    // Hex  1 A   D   6 
    // Hex  1AD6  

    static int pattern = 0x1AD6; 

    public static int getNumber(int i) 
    { 
     return (pattern >> i) & 0x03;  
    } 

    public static void main(String[] args) 
    { 
     for(int i = 0; i < 14; i += 2) 
     { 
      System.out.println("***".substring(0, getNumber(i))); 
     } 
    } 
} 
3

如果你必须有一个循环,存储你的模式在一个字符串,并使用for循环由字符打印字符:

String pattern = "**\n*\n*\n***\n**\n**\n*\n"; 
for (int i = 0 ; i != pattern.length() ; i++) { 
    System.out.print(pattern.charAt(i)); 
} 

当然,直接打印相同的图案是一个更直接的方式做同样的事情。

0

为什么你需要第二个变量?

public class HelloWorld{ 

    public static void main(String []args){ 

     String output = "**,*,*,***,**,**,*"; 

     for (String row : output.split(",")) { 
      System.out.println(row); 
     } 

    } 

} 
+0

正如我在问题中提到的,我不允许使用数组。这就是为什么它令人困惑 –

+0

对,很抱歉,我改变了没有数组的评论。 –

3

如果您不允许使用数组,然后使用一个字符串:字符的

String q = "2113221"; 

for(int i = 0; i < q.length(); i++){ 
    int p = q.charAt(i)-'0'; 
    System.out.println("**********************".substring(0, p)); 
} 
+1

''***“'在这里就够了(而不是'”**********************“')。 – Tom

3

如果要严格,字符串也是数组。这是我的可能的解决方案:

static void printPattern() { 
    for(int v = 187307; v > 0 ; v >>= 1) { 
     int b = -(v & 1); 
     int cr = '\n' & ~b; 
     int star = '*' & b; 
     char c = (char) (cr | star); 
     System.out.print(c); 
    } 
} 
+0

这是一个非常棒的解决方案 - 但我真的希望没有人会因为纸笔面试问题而期待这一点。 –

+0

我希望是一样的。 Howerver是可行的,只需要花时间手动计算正确的数字。 –

1

假设测试的隐含的问题是:“寻找模式序列背后的逻辑”,数字序列2 1 1 3 2 2 1是非常接近subractions的迭代(迭代步骤减去两个最后值的和)。

迭代2至8你有号码的顺序如下:

  • 2 - (0 + 0)= 2
  • 3 - (2 + 0)= 1
  • 4 - ( 1 + 2)= 1
  • 5 - (1 + 1)= 3
  • 6 - (3 + 1)= 2
  • 7 - (2 + 3)= 2
  • 8 - (2 + 2)= 4(应该b e 1)

下面的程序按照这个思路进行迭代并构建请求的模式。

我不得不添加一些技巧来计算序列的最后一个值,因为我发现逻辑计算需要二进制操作4转换为1

public class Test 
{ 
    public static void main(String[] args) 
    { 
     int n0 = 0; 
     int n1 = 0; 

     for(int i = 2; i < 9; ++i) 
     { 
      int n = i - n0 - n1; 
      int p = (n & 3) + (n >> 2); 

      System.out.println("***".substring(0, p)); 

      n0 = n1; 
      n1 = n; 
     } 
    } 
}