下面的问题有一个字符列表和列数作为输入。列数不是常量,可以随每个输入而变化。 输出应该完全占用所有行,除了最后一行。
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();
}
}
我正在尝试使用算法来打印正确的输出。我想知道解决这个问题的不同方法有哪些。时间和空间的复杂性并不重要。我上面尝试的方法也是错误的,因为它以列为参数,但实际上是行数。
仅供参考:这不是家庭作业问题。
答案 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
针对不同的输入重复这样做;并且您很快就会发现需要逐行打印的索引模式。