对于改变的锯齿形印刷,什么是更好的解决方案?

时间:2011-08-29 22:02:38

标签: java string algorithm implementation

考虑对字符串进行以下转换。给定一个行和一个字符串作为输入,将这个字符串在行之间来回曲折地写入。例如,给定输入

  

请将我转换为自定义的曲折打印格式

有三行,我们会将字符串写成这样的曲折:

P   s   n   t   o   s   i   z   a   i   n   r
 l a e o v r m t a u t m z d i z g r n i g o m t
 e   c   e   e   c   o   e   g   p   t   f   a

(请不要编辑此打印输出,这是必需的输出,它不是真正的曲折,它是 定制的之字形)

最后,我们将每一行的竞争连接起来以获得结果字符串

Psntosizainrlaeovrmtautmzdizgrnigomteceecoegptfa

我有一个针对这个问题的算法草图,我在这里以伪代码写出:

it is asking about the relationship between {index} and {output row and  col}
Def:
  down = false;
  up = false; 
  r=0;
  c=0;
  char[][] output; 
there are three cases here:
case 1: 
  index % 4 == 0, it is the beginning of a down printing
  r = 0;
  output[r][c] = in.charAt(index);
  c++;
  down = true; up = false;

case 2:
  index%4 != 0 && down = true;
  r = index % 4;
  output[r][c] = in.charAt(index);
  if( r == 2){ up = true; down = false; c++;}  // when come to the last row of a down formatting

case 3:
  index%4 != 0 && up == true;
  r = 4- index%4;
  output[r][c] = in.charAt(index);
  c++;

对于一般解决方案,我可以将4替换为nRows+1;

虽然我觉得这很有效,但我对此并不满意。有没有人有更清晰或更快的算法来解决这个问题?

2 个答案:

答案 0 :(得分:1)

可能会使此问题更容易解决的一个观察结果如下:假设您的行数为3,并希望在分配字符的行之间保持曲折。然后,如果循环超过四个字符,则在重复此模式之前将它们添加到行1,2,3和2中。如果行数为5,则在重复此模式之前,您将访问行1,2,3,4,5,4,3和2。更一般地说,如果你有一个k的行数,那么分配字符的行集遵循模式1,2,3,...,k,k - 1,k - 2,...,2 ,长度为2k - 2.

鉴于此观察结果,您可以通过预先计算包含此循环的表以及该循环的长度来使代码更加清晰。拥有此表后,您可以循环切换字符,跟踪您所在的字符。当你在第n个字符上时,你将索引到位于n mod k的表中,然后将该字符分配到该行中。

在伪代码中(使用基于一个索引):

rowTable = new array of ints length 2k - 2
for i = 1 up to k:
    rowTable[i] = i
for i = 2 up to k - 1:
    rowTable[(2k - 1) - (i - 2)] = i

resultRows = new array of strings of length k

for i = 1 up to the length of your string:
    Append the current character to resultRows[rowTable[i mod k]]

Concatenate all the entries of resultRows

这种方法不要求你将所有不同的情况硬编码到switch语句中,这意味着它可以处理任意k而不仅仅是k = 3.而且,它非常快;运行时为O(n + k),其中n是字符串的长度,k是行数。

希望这有帮助!

答案 1 :(得分:0)

你如何看待这一个。原始字符串为s - 字符串中0rows-1的复制字符str

str[rows]=some impossible to occur in d original string character , like -1

- 将s[r]s[2r-3]的反向字符复制到str

str[2r-2]=some impossible to occur in d original string character, -1

重复直到这两个步骤的长度被逐一覆盖。

在字符串str中,占用行位置的每个字符,即str[0],str[rows],str[2rows] ...跳过str[rows]为-1的位置。 重复此步骤直到str。

的长度