【问题标题】:What is a better solution for a changed zigzag printing?改变之字形印刷有什么更好的解决方案?
【发布时间】:2011-08-29 22:02:37
【问题描述】:

考虑以下对字符串的转换。给定多个行和一个字符串作为输入,将该字符串以之字形在行间来回写入。例如,给定输入

请将我转换为自定义的锯齿形打印格式

三行,我们将字符串写成这样的之字形:

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;

虽然我认为这可行,但我对此不太满意。有没有人有更清晰或更快的算法来解决这个问题?

【问题讨论】:

  • 这是作业吗?如果是这样,请标记为这样。此外,此代码不是 java - 请适当编辑您的标签
  • @Bohemian:可能是伪代码

标签: java string algorithm implementation


【解决方案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,2,3,...,k-1, k-2, k-1,...,2 是一个长度为 2k-1 的大循环,其中,1,2,..,k-1是一个小循环(row++,col不变),k-2,k-3,...,1是另一个小循环(row--,col++)
【解决方案2】:

你觉得这个怎么样。原始字符串为s - 将字符串中的字符从0 复制到rows-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 的长度。

【讨论】:

  • 您好,欢迎您。请注意这个网站的名称是 Stack Overflow 而不是 Gangsta Rap。谢谢。
猜你喜欢
  • 1970-01-01
  • 2021-08-02
  • 1970-01-01
  • 1970-01-01
  • 2021-05-06
  • 2015-02-04
  • 2012-02-28
  • 1970-01-01
  • 2023-03-22
相关资源
最近更新 更多