2013-02-26 30 views
5

Đây thực sự là một câu hỏi phỏng vấn. Tôi đã phải in bằng cách sử dụng Java sau:Cách in chuỗi sau, trong khi thỏa mãn các điều kiện này

9 
9 8 9 
9 8 7 8 9 
9 8 7 6 7 8 9 
. . . 
. . . 

Trong cuộc phỏng vấn, tôi đã viết một mảnh xấu hổ mã, nhưng nó làm việc dù sao - sử dụng một vòng lặp bên ngoài, hai vòng bên trong (một cho chuỗi decrementing và một cho chuỗi tăng dần!) và một tấn biến. Một trong các biến là độ dài của mỗi hàng.

Người phỏng vấn hỏi tôi để thử và viết lại nó bằng cách sử

  • chỉ là một bên ngoài và một vòng lặp bên trong

  • mà không biến chiều dài hàng.

Lưu ý: Sau khi xem câu trả lời, tôi nghĩ người phỏng vấn không thực sự có nghĩa là điều kiện thứ hai. Anh ta có thể chỉ muốn tôi đơn giản hóa mã của tôi và điểm thứ hai chỉ lẩm bẩm ra khỏi miệng anh ta.

Vì vậy, sau đó trở về nhà, tôi đến đây:

int rowCnt = 5; 

for(int i = 1; i <= rowCnt; i++) 
{ 
    int val = 9; 
    int delta = -1; 
    int rowLen = i * 2 - 1; 

    for(int j = 1; j <= rowLen; j++) 
    { 
     System.out.print(val + " "); 

     val += delta; 

     if(j >= rowLen/2) delta = 1; 
    } 

    System.out.println(); 
} 

Ở đây, tôi đang sử dụng chỉ là một vòng trong. Tôi đang sử dụng giá trị delta để xác định xem số tiền tăng hoặc giảm có xảy ra hay không. Đối với mỗi hàng, tôi so sánh chỉ mục hiện tại với điểm giữa của hàng và thay đổi delta.

Tôi hài lòng với điều kiện đầu tiên - chỉ một vòng lặp bên trong. Nhưng tôi không thể làm điều đó mà không sử dụng độ dài hàng.

Làm cách nào chúng ta có thể in điều này mà không tìm ra độ dài hàng?

Nhiều câu trả lời có thể chấp nhận được, nhưng tôi phải chọn một câu trả lời và chọn câu trả lời đơn giản nhất để hiểu tôi.

+0

Hãy thử 'StringBuilder': 'reverse' và' append', và một int decrementing duy nhất ... –

+0

bạn không thể chỉ thay thế biểu hiện thực tế (tuyên bố) trong địa điểm của 'rowLen'? – SparKot

+0

Lưu ý rằng bạn giảm '9'' currentRow - 1' lần. Bạn có thể sử dụng nó thay vì chiều dài hàng. Cả hai có liên quan mặc dù, do đó, nó có vẻ như một yêu cầu ngớ ngẩn không sử dụng chiều dài hàng, nhưng bất cứ điều gì. – IVlad

Trả lời

2

Họ có thể muốn nghe từ 'đệ quy'.

Dưới đây là một giải pháp đệ quy mà không cần chiều dài:

countDownInMiddle("", 9, ""); 

private static void countDownInMiddle(String start, int n, String end) { 
    if (n < 0) { 
     return; 
    } 
    System.out.println(start + n + end); 
    countDownInMiddle(start + n, n - 1, n + end); 
} 
+0

đẹp. Tôi đã nghĩ rằng có một cách ngắn gọn hơn nhưng không thể quấn quanh đầu tôi ... –

2

Làm thế nào về:

int start = 9; 
    for (int i = 0; i <= start; i++) { 
     StringBuilder sb = new StringBuilder((start - i) + " "); 
     for (int j = start - i; j < start; j++) { 
      sb.insert(0, (j + 1) + " "); 
      sb.append((j + 1) + " "); 
     } 
     System.out.println(sb.toString()); 
    } 
1

Đây là đơn giản PHP, hy vọng logic là rõ ràng và dễ dàng cầm tay tới Java:

$rowCount = 10; 
$startNum = 9; 

for ($idx =0; $idx <$rowCount; $idx ++) { 

    for ($jdx=0; $jdx < (2*$idx +1); $jdx++) { 

     if ($idx < $jdx) 
      echo $startNum -(2*$idx) + $jdx.' '; 
     else 
      echo $startNum - $jdx.' '; 
    } 
    echo '<br/>'; 
} 
0
public class Pyramid { 
    public static void main(String[] args) { 
     int start = 9; 
     String left = ""; 
     String right = ""; 
     for (int i=start; i>=0; i--) { 
      System.out.println(left+i+right); 
      left = left+i; 
      right = i+right; 
     } 
    } 
} 

Mẫu đầu ra:

9 
989 
98789 
9876789 
987656789 
98765456789 
9876543456789 
987654323456789 
98765432123456789 
987654321

giải pháp lặp đi lặp lại này tương đương với giải pháp đệ quy. Tôi muốn sử dụng lặp lại trên đệ quy vì bộ nhớ ngăn xếp bổ sung cần thiết bởi các giải pháp đệ quy có thể là rất lớn khi số hàng tăng trưởng lớn.

0

My giải pháp phi đệ quy:

for(int i = 0; i < 9; i++) { 
     for(int j = 0; j < 2*i+1; j++) 
      System.out.print((Math.abs(j - i) + 9 - i) + " "); 
     System.out.println(); 
    } 
Các vấn đề liên quan