算法内容
将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。比如输入字符串为 “PAYPALISHIRING” 行数为 3 时,排列如下:
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“PAHNAPLSIIGYIR”。请你实现这个将字符串进行指定行数变换的函数:string convert(string s, int numRows);
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/zigzag-conversion
算法思想
“Z”字形可以通过行元素下标之间的差距来进行元素重新整合。以行号为初始循环体,再以字符串长度为嵌套循环。
if(numRows==1){
//若行号为1时直接输出
return s;
}
for(int i=0;i<numRows;i++){
/**
* num用来指定元素位置
* count用来表示每行元素之间的差距
* */
num=i;
count=sum-num*2;
while(num<s.length()){
q+=s.charAt(num);
if(count==0||count==sum){
//这个条件表示第一行和最后一行
num+=sum;
}else{
//除第一行和最后一行的其他行
/**
* num+count表示下一个元素的位置
* sum-count表示下一个元素距离上一个元素的差距(大家可以画一下行数为4)
* */
num=num+count;
count=sum-count;
}
}
}
整体算法
public class Day_06 {
static Scanner input=new Scanner(System.in);
public static String convert(String s, int numRows) {
int sum=2*(numRows-1);
int num;
int count;
String q=new String();
if(numRows==1){
return s;
}
for(int i=0;i<numRows;i++){
num=i;
count=sum-num*2;
while(num<s.length()){
q+=s.charAt(num);
if(count==0||count==sum){
num+=sum;
}else{
num=num+count;
count=sum-count;
}
}
}
return q;
}
public static void main(String[] args) {
String s=input.nextLine();
int num=input.nextInt();
String q=convert(s,num);
System.out.println(q);
}
}
尾语
以上属于个人见解,有好的想法可以在下方评论写出自己的想法,大家一起进步。该题是力扣上的题,若有侵权,请及时告知。该题链接:https://leetcode-cn.com/problems/zigzag-conversion