专业的JAVA编程教程与资源

网站首页 > java教程 正文

Java笔试-"Z"字形排列字符串

temp10 2025-04-06 21:05:31 java教程 5 ℃ 0 评论
将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。

 示例 1:	
 s = "PAYPALISHIRING", numRows = 3 时,排列如下:
 
 P   A   H   N
 A P L S I I G
 Y   I   R
 之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"PAHNAPLSIIGYIR"。
 
 示例 2:
 输入:s = "PAYPALISHIRING", numRows = 4
 排列:
 P     I    N
 A   L S  I G
 Y A   H R
 P     I
 输出:"PINALSIGYAHRPI"

分析:

可以观察规律,每2n-2个都会重复一次

Java笔试-"Z"字形排列字符串

代码解法

public static void main(String[] args) {
    String s = "PAYPALISHIRING";
    int numRows = 3;

    Map<Integer, List> temp = new HashMap<>();
    int lineNum = 0;
    // “|/|\|”形中一次竖折的数目
    int modNum = 2*numRows-2;
    boolean plusFlag=true;
    for (int i = 0; i < s.length(); i++) {
        // 第一个转向,需要行数递减
        if (i%modNum == numRows) {
            lineNum = lineNum-2;
            plusFlag = false;
        // 第二个转向,说明进入第二次的“|\”,需要行数归0,并递增
        } else if (i%modNum == 0){
            lineNum=0;
            plusFlag = true;
        }
        if (!temp.containsKey(lineNum)) {
            temp.put(lineNum, new ArrayList<>());
        }
        temp.get(lineNum).add(s.charAt(i));
        if (plusFlag) {
            lineNum++;
        } else {
            lineNum--;
        }
    }

    // 合并字符串
    String result = temp.values().stream()
            .map( characters -> characters.stream().map(String::valueOf).collect(Collectors.joining()))
            .collect(Collectors.joining());

    System.out.println(result);
}

#java##后端开发面试##算法#

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表