字形变换Java版(力扣)

简介: 字形变换Java版(力扣)

字形变换


将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。


比如输入字符串为 “PAYPALISHIRING” 行数为 3 时,排列如下:

2021032416022545.png

之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“PAHNAPLSIIGYIR”。

请你实现这个将字符串进行指定行数变换的函数:

string convert(string s, int numRows);


示例 1:

输入:s = “PAYPALISHIRING”, numRows = 3

输出:"PAHNAPLSIIGYIR"


示例 2:

输入:s = “PAYPALISHIRING”, numRows = 4

输出:“PINALSIGYAHRPI”

解释:

20210324160335478.png

示例 3:

输入:s = “A”, numRows = 1

输出:"A"


提示:

1 <= s.length <= 1000

s 由英文字母(小写和大写)、’,’ 和 ‘.’ 组成

1 <= numRows <= 1000


题意:就是给个字符串,把这个字符串按照Z排列,然后我们把排后的结果按行读取输出结果。


思路:创建numRows个StringBuilder,放在集合中,然后我们便利字符串,便利到当前字符时,判断是属于哪行,然后就把这个字符放到这行的StringBuilder中,然后将每行合到一起,输出结果。


正确代码:


class Solution {
    public String convert(String s, int numRows) {
        if(numRows==1) return s;
        List<StringBuilder> rows = new ArrayList<>();
        for (int i = 0; i < Math.min(numRows, s.length()); i++) {
            rows.add(new StringBuilder());
        }
        int currentLine = 0; //当前所处的行
        int flag=-1; // 是否处于拐点,拐点是行数增加或减少
        for (char c : s.toCharArray()) {
            rows.get(currentLine).append(c);
            if(currentLine==0||currentLine==numRows-1) flag = - flag;
            currentLine += flag;
        }
        StringBuilder ret = new StringBuilder();
        for (StringBuilder row : rows) {
            ret.append(row);
        }
        return ret.toString();
    }
}

完整代码(含测试代码):

package com.Keafmd.February.day24;
import java.util.ArrayList;
import java.util.List;
/**
 * Keafmd
 *
 * @ClassName: ZigzagConversion
 * @Description: 字形变换 https://leetcode-cn.com/problems/zigzag-conversion/
 * @author: 牛哄哄的柯南
 * @Date: 2021-03-24 15:00
 * @Blog: https://keafmd.blog.csdn.net/
 */
public class ZigzagConversion {
    public static void main(String[] args) {
        String  s1 = "PAYPALISHIRING";
        int numRows =3 ;
        Solution03141 solution03141 = new Solution03141();
        String result = solution03141.convert(s1,numRows);
        System.out.println("result = " + result);
    }
}
/*    P   A   H   N
      A P L S I I G
      Y   I   R
      P     I    N
      A   L S  I G
      Y A   H R
      P     I
      */
class Solution03141 {
    public String convert(String s, int numRows) {
        if(numRows==1) return s;
        List<StringBuilder> rows = new ArrayList<>();
        for (int i = 0; i < Math.min(numRows, s.length()); i++) {
            rows.add(new StringBuilder());
        }
        int currentLine = 0; //当前所处的行
        int flag=-1; // 是否处于拐点,拐点是行数增加或减少
        for (char c : s.toCharArray()) {
            rows.get(currentLine).append(c);
            if(currentLine==0||currentLine==numRows-1) flag = - flag;
            currentLine += flag;
        }
        StringBuilder ret = new StringBuilder();
        for (StringBuilder row : rows) {
            ret.append(row);
        }
        return ret.toString();
    }
}

输出结果:

result = PAHNAPLSIIGYIR
Process finished with exit code 0
相关文章
|
6月前
|
Java
383. 赎金信 --力扣 --JAVA
给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能c里面的字符构成。 如果可以,返回 true ;否则返回 false 。 magazine 中的每个字符只能在 ransomNote 中使用一次。
44 1
|
6月前
|
Java
1276. 不浪费原料的汉堡制作方案 --力扣 --JAVA
圣诞活动预热开始啦,汉堡店推出了全新的汉堡套餐。为了避免浪费原料,请你帮他们制定合适的制作计划。 给你两个整数 tomatoSlices 和 cheeseSlices,分别表示番茄片和奶酪片的数目。不同汉堡的原料搭配如下: 巨无霸汉堡:4 片番茄和 1 片奶酪 小皇堡:2 片番茄和 1 片奶酪 请你以 [total_jumbo, total_small]([巨无霸汉堡总数,小皇堡总数])的格式返回恰当的制作方案,使得剩下的番茄片 tomatoSlices 和奶酪片 cheeseSlices 的数量都是 0。 如果无法使剩下的番茄片 tomatoSlices 和奶酪片 cheeseSlic
52 0
|
6月前
|
Java
2866. 美丽塔 II --力扣 --JAVA
给你一个长度为 n 下标从 0 开始的整数数组 maxHeights 。 你的任务是在坐标轴上建 n 座塔。第 i 座塔的下标为 i ,高度为 heights[i] 。 如果以下条件满足,我们称这些塔是 美丽 的: 1 <= heights[i] <= maxHeights[i] heights 是一个 山脉 数组。 如果存在下标 i 满足以下条件,那么我们称数组 heights 是一个 山脉 数组: 对于所有 0 < j <= i ,都有 heights[j - 1] <= heights[j] 对于所有 i <= k < n - 1 ,都有 heights[k + 1] <= he
93 0
|
6月前
|
存储 Java 索引
350. 两个数组的交集 II --力扣 --JAVA
给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。
49 0
|
6月前
|
存储 Java
17. 电话号码的字母组合 --力扣 --JAVA
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
54 0
|
5月前
|
Java
P9242 [蓝桥杯 2023 省 B] 接龙数列JAVA,边权为1的最短路问题,洛谷P9242 [蓝桥杯 2023 省 B] 接龙数列​编辑力扣1926.迷宫离入口最近的出口力扣433.
P9242 [蓝桥杯 2023 省 B] 接龙数列JAVA,边权为1的最短路问题,洛谷P9242 [蓝桥杯 2023 省 B] 接龙数列​编辑力扣1926.迷宫离入口最近的出口力扣433.
|
6月前
|
存储 Java
JAVA数据结构刷题 -- 力扣二叉树
JAVA数据结构刷题 -- 力扣二叉树
55 0
|
6月前
|
存储 Java 容器
Java变换两个变量的值
Java变换两个变量的值
|
6月前
|
算法 C++ Java
Java每日一练(20230422) 拼接最大数、Z字形变换、跳跃游戏
Java每日一练(20230422) 拼接最大数、Z字形变换、跳跃游戏
71 0
Java每日一练(20230422) 拼接最大数、Z字形变换、跳跃游戏
|
6月前
|
安全 Java
1599. 经营摩天轮的最大利润 -- 力扣 --JAVA
你正在经营一座摩天轮,该摩天轮共有 4 个座舱 ,每个座舱 最多可以容纳 4 位游客 。你可以 逆时针 轮转座舱,但每次轮转都需要支付一定的运行成本 runningCost 。摩天轮每次轮转都恰好转动 1 / 4 周。 给你一个长度为 n 的数组 customers , customers[i] 是在第 i 次轮转(下标从 0 开始)之前到达的新游客的数量。这也意味着你必须在新游客到来前轮转 i 次。每位游客在登上离地面最近的座舱前都会支付登舱成本 boardingCost ,一旦该座舱再次抵达地面,他们就会离开座舱结束游玩。 你可以随时停下摩天轮,即便是 在服务所有游客之前 。如果你决定
82 1