将字符打印为矩阵

时间:2017-03-30 06:25:57

标签: java for-loop matrix

下面的问题有一个字符列表和列数作为输入。列数不是常量,可以随每个输入而变化。 输出应该完全占用所有行,除了最后一行。

var moment = require('moment-timezone');

var guessUserTimeZone = moment.tz.guess();
var date = moment().tz(guessUserTimeZone).format('MMMM Do YYYY, h:mm:ss a')

我在下面尝试过:

list: a b c d e f g
colums: 3

Wrong:
a b c
d e f
g

Wrong:
a d g
b e
c f

Correct:
a d f
b e g
c

它输出为(错误):

public static void printPatern(List<Character> list, int cols) {

    for (int i = 0; i < cols; i++) {

        for (int j = i; j < list.size(); j += cols) {
            System.out.print(list.get(j));

        }
        System.out.println();
    }
}

我正在尝试使用算法来打印正确的输出。我想知道解决这个问题的不同方法有哪些。时间和空间的复杂性并不重要。我上面尝试的方法也是错误的,因为它以列为参数,但实际上是行数。

仅供参考:这不是家庭作业问题。

2 个答案:

答案 0 :(得分:3)

最后能够为这个问题设计算法 请参考下面的java代码相同

 public class puzzle{
        public static void main(String[] args){

            String list[] = { "a", "b", "c","d","e","f","g","h","i","j" };
            int column = 3;

            int rows = list.length/column; //Calculate total full rows
            int lastRowElement = list.length%column;//identify number of elements in last row
            if(lastRowElement >0){
                rows++;//add inclomplete row to total number of full filled rows
            }
            //Iterate over rows
             for (int i = 0; i < rows; i++) {
                int j=i;
                int columnIndex = 1;
                while(j < list.length && columnIndex <=column ){
                    System.out.print("\t"+list[j]);
                    if(columnIndex<=lastRowElement){
                        if(i==rows-1 && columnIndex==lastRowElement){
                            j=list.length; //for last row display nothing after column index reaches to number of elements in last row
                        }else{
                            j += rows; //for other rows if columnIndex is less than or equal to number of elements in last row then add j value by number of rows
                        }

                    }else {
                       if(lastRowElement==0){
                          j += rows;
                       }else{
                        j += rows-1; //for column greater than number of element in last row add j = row-1 as last row will not having the column for this column index.
                       }
                    }

                    columnIndex++;//Increase column Index by 1;
                }

                System.out.println();
                }
        }
    }

答案 1 :(得分:0)

这可能是功课;所以我不打算为你做,但给你一些提示去。这里有两点:

  • 计算正确的行数
  • 计算循环列表时所需的“模式”,以便打印预期结果

对于第一部分,您可以查看模运算;对于第二部分:开始“在纸上”重复列表,并观察如何手动打印正确的结果。

显然,第二部分是更复杂的部分。如果您意识到“逐列”打印是直截了当的,这可能会有所帮助。因此,当我们采用您的正确示例并打印索引而不是值时,您会得到:

0 3 6
1 4 7
2 5

针对不同的输入重复这样做;并且您很快就会发现需要逐行打印的索引模式。