首页 > 其他分享 >『LeetCode』6. N 字形变换 Zigzag Conversion

『LeetCode』6. N 字形变换 Zigzag Conversion

时间:2023-12-24 10:55:55浏览次数:38  
标签:Conversion rows res Zigzag numRows flag StringBuilder 字符串 LeetCode

题目描述

将一个给定字符串s根据给定的行数numRows,以从上往下、从左到右进行Z字形排列。
比如输入字符串为"PAYPALISHIRING"行数为3时,排列如下:

P   A   H   N
A P L S I I G
Y   I   R

之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"PAHNAPLSIIGYIR"
请你实现这个将字符串进行指定行数变换的函数:

string convert(string s, int numRows);


示例 1

输入:s = "PAYPALISHIRING", numRows = 3
输出:"PAHNAPLSIIGYIR"

示例 2

输入:s = "PAYPALISHIRING", numRows = 4
输出:"PINALSIGYAHRPI"
解释

P     I    N
A   L S  I G
Y A   H R
P     I

示例 3

输入:s = "A", numRows = 1
输出:"A"


提示

  • 1 <= s.length <= 1000
  • s由英文字母(小写和大写)、',' '.'组成
  • 1 <= numRows <= 1000

题目链接https://leetcode.cn/problems/zigzag-conversion/description/

『1』巧设 flag

解题思路

我们的目标是按行打印,可以观察每行的字符变换,在遍历字符串时,每个字符的行索引先是变大,到达转折点后再变小,如此反复。
因此解决方案为:先定义一个字符串数组rows用于存储各行的字符串,再定义一个flag变量并初始化为-1,通过将当前行索引iflag相加来实现行索引i的增减并把字符s.charAt(i)填到正确的行rows[i],当遍历到转折点(首行或尾行)时将flag取反以实现转向,遍历结束后用字符串res拼接字符串数组rows中的各字符串,返回结果。

算法流程
按顺序遍历字符串s

  • rows[i] += c: 把每个字符c填入对应行rows[i]
  • i += flag: 更新当前字符c对应的行索引;
  • flag = - flag: 在达到ZZZ字形转折点时,执行反向。

实现代码

class Solution {
    // Usage of Flag
    // n is the length of s
    // Time Complexity: O(n^2)
    // Space Complexity: O(n^2)
    public String convert(String s, int numRows) {
        if (numRows == 1 || s.length() <= numRows) return s;

        List<StringBuilder> rows = new ArrayList<>();
        for (int i = 0; i < numRows; i++) rows.add(new StringBuilder());
        int i = 0, flag = -1;
        for (char c : s.toCharArray()) {
            rows.get(i).append(c);
            if (i == 0 || i == numRows - 1) flag = -flag;
            i += flag;
        }
        StringBuilder res = new StringBuilder();
        for (StringBuilder row : rows) res.append(row);
        return res.toString();
    }
}

『2』

解题思路

实现代码


『3』

解题思路

实现代码



标签:Conversion,rows,res,Zigzag,numRows,flag,StringBuilder,字符串,LeetCode
From: https://www.cnblogs.com/torry2022/p/17924158.html

相关文章

  • 『LeetCode』5. 最长回文子串 Longest Palindromic Substring
    题目描述给你一个字符串s,找到s中最长的回文子串。如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。示例1:输入:s="babad"输出:"bab"解释:"aba"同样是符合题意的答案。示例2:输入**:s="cbbd"输出:"bb"提示:1<=s.length<=1000s仅由数字和英文字母组......
  • leetcode-88 合并两个有序数组
    题目要求:给你两个按非递减顺序排列的整数数组nums1和nums2,另有两个整数m和n,分别表示nums1和nums2中的元素数目。请你合并nums2到nums1中,使合并后的数组同样按非递减顺序排列。注意:最终,合并后数组不应由函数返回,而是存储在数组nums1中。为了应对这种情况,n......
  • 『LeetCode』3. 无重复字符的最长子串 Longest Substring Without Repeating Characte
    『1』双指针算法我的想法:一般看到字符串子串问题想到用双指针解,看到字符串子序列问题想到用动态规划解。此题用双指针可以很快解题。遍历字符串中的每个字符s.charAt[i],对于每一个i,找到j使得双指针[j,i]维护的是以s.charAt[i]结尾的无重复字符的最长子串,长度为i-j+1,......
  • [LeetCode] 热题100
    128最长连续序列publicclassSolution{publicintlongestConsecutive(int[]nums){if(nums==null||nums.length==0)return0;intans=1;HashMap<Integer,Integer>map=newHashMap<>();for(intnum:......
  • Leetcode—矩阵置零
    矩阵置零给定一个mxn的矩阵,如果一个元素为0,则将其所在行和列的所有元素都设为0。请使用原地算法。示例1:输入:输入:matrix=[[1,1,1],[1,0,1],[1,1,1]]输出:[[1,0,1],[0,0,0],[1,0,1]]示例2:输入:matrix=[[0,1,2,0],[3,4,5,2],[1,3,1,5]]输出:[[0,0,0,0],[0,4,......
  • Leetcode 2521. 数组乘积中的不同质因数数目
    https://leetcode.cn/problems/distinct-prime-factors-of-product-of-array/description/给你一个正整数数组nums,对nums所有元素求积之后,找出并返回乘积中不同质因数的数目。注意:质数是指大于1且仅能被1及自身整除的数字。如果val2/val1是一个整数,则整数val......
  • 『LeetCode』2. 两数相加 Add Two Numbers
    『1』迭代法classSolution{//Iteration//Nisthesizeofl1,Misthesizeofl2//TimeComplexity:O(max(M,N))//SpaceComplexity:O(max(M,N))ifdummyiscountedelseO(1)publicListNodeaddTwoNumbers(ListNodel1,ListNodel2)......
  • Leetcode 2507. 使用质因数之和替换后可以取到的最小值 优化前 优化后
    https://leetcode.cn/problems/smallest-value-after-replacing-with-sum-of-prime-factors/description/给你一个正整数n。请你将n的值替换为n的质因数之和,重复这一过程。注意,如果n能够被某个质因数多次整除,则在求和时,应当包含这个质因数同样次数。返回n可以取到......
  • 『LeetCode』1. 两数之和 Two Sum
    『1』暴力法classSolution{//BruteForce//TimeComplexity:O(n^2)//SpaceComplexity:O(1)publicint[]twoSum(int[]nums,inttarget){for(inti=0;i<nums.length;i++){for(intj=i+1;j<nums.length......
  • [LeetCode Hot 100] LeetCode74. 搜索二维矩阵
    题目描述思路:二维矩阵坐标变换+二分查找二维矩阵坐标变换:只要知道二维数组的的行数m和列数n,二维数组的坐标(i,j)可以映射成一维的index=i*n+j;反过来也可以通过一维index反解出二维坐标i=index/n,j=index%n。(n是列数)把二维数组matrix的元素访问抽象成在......