在没有嵌套循环的情况下创建特定模式

时间:2016-06-18 09:34:00

标签: java

我有这个奇怪的问题,我应该创建以下模式,

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

使用单个for循环,但问题是我甚至不允许使用if/else甚至Array等条件语句

我能想到打印这种模式的唯一方法是将整个模式存储在变量中然后打印它,但是这个解决方案使得for循环的实现无用,除非我创建两个不同的变量,打破模式分成两部分,然后使用for循环打印它们,但这种方法很差。

有人可以告诉我如何使用for循环使用automatic方法实现这一点,而不是将它们存储在变量中?

P.S:这是在求职面试中提出的挑战性问题。

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

6 个答案:

答案 0 :(得分: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));
}

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

答案 1 :(得分:3)

如果不允许使用数组,则使用字符串:

String q = "2113221";

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

答案 2 :(得分:3)

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

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

答案 3 :(得分: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)));
        }
    }
}

答案 4 :(得分:1)

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

从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(应为1)

以下程序按照这个想法进行迭代并构建所请求的模式。

我必须添加一些技巧来计算序列的最后一个值,因为我发现的逻辑将4计算为最后一个值而不是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;
        }
    }
}

答案 5 :(得分:0)

为什么需要第二个变量?

If Not (Me.frmdamagesub.Form.Recordset.EOF And Me.frmdamagesub.Form.Recordset.BOF) Then
  With Me.frmdamagesub.Form.Recordset
    Me.txtquantity = .Fields("Quantity")
    Me.txtquantity.Tag = .Fields("Quantity")
    Me.cmdedit.Caption = " Update"
    CurrentDb.Execute " UPDATE damaged_card " & _
    " SET Quantity='" & Me.txtquantity & "'" & _
    " WHERE Quantity=" & Me.txtquantity.Tag

  End With
End If