拿来吧你!⚡考研面试⚡每天练—— Z 字形变换(StringBuilder的用法总结)

Posted 肥学大师

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了拿来吧你!⚡考研面试⚡每天练—— Z 字形变换(StringBuilder的用法总结)相关的知识,希望对你有一定的参考价值。

🌹题目

将一个给定字符串 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
通过次数282,291提交次数558,797

🌹一点点思路

说是话我最怕这种图形题了,我觉的它们一般最好的做法就是别去跟着规律实现这个图形某一个数值,而应该去找它的规律得到数值。例如杨辉三角的那些题,你不必非要把要得到的数字从头到尾一个一个算出来,只要找到规律就可以得出结果了。这种题往往是像找规律一样不是单纯的考数据结构和算法更加考察灵活性。

🌹我的解题思路

我觉得 ==“怕啥来啥”==说的一点也没错。我今天就挑战这个题。看了半天我不擅长找规律就用最直接的办法,二维数组开始想的是把一个字符串按Z字形放进去有字母的地方把字母存进数组,后来想想没必要还不如直接就存进去。


类似这样,一个二维数组

好了这下知道怎么存取的方式了。让我们来看看怎么按Z字形放进去吧。

🌹开干

🌹开始之前我们先介绍今天的函数StringBuilder的用法总结

在程序开发过程中,我们常常碰到字符串连接的情况,方便和直接的方式是通过"+"符号来实现,但是这种方式达到目的的效率比较低,且每执行一次都会创建一个String对象,即耗时,又浪费空间。使用StringBuilder类就可以避免这种问题的发生,下面就Stringbuilder的使用做个简要的总结:

一、创建Stringbuilder对象

StringBuilder strB = new StringBuilder();
1、append(String str)/append(Char c):字符串连接

System.out.println("StringBuilder:"+strB.append("ch").append("111").append('c'));

//return "StringBuilder:ch111c"
2、toString():返回一个与构建起或缓冲器内容相同的字符串

System.out.println("String:"+strB.toString());

//return "String:ch111c"
3、appendcodePoint(int cp):追加一个代码点,并将其转换为一个或两个代码单元并返回this

System.out.println("StringBuilder.appendCodePoint:"+strB.appendCodePoint(2));

//return "StringBuilder.appendCodePoint:ch111c"
4、setCharAt(int i, char c):将第 i 个代码单元设置为 c(可以理解为替换)

strB.setCharAt(2, 'd');

System.out.println("StringBuilder.setCharAt:" + strB);

//return "StringBuilder.setCharAt:chd11c"
5insert(int offset, String str)/insert(int offset, Char c):在指定位置之前插入字符()

System.out.println("StringBuilder.insertString:"+ strB.insert(2, "LS"));

//return "StringBuilder.insertString:chLSd11c"

System.out.println("StringBuilder.insertChar:"+ strB.insert(2, 'L'));

//return "StringBuilder.insertChar:chLLSd11c"
6delete(int startIndex,int endIndex):删除起始位置(含)到结尾位置(不含)之间的字符串

System.out.println("StringBuilder.delete:"+ strB.delete(2, 4));

//return "StringBuilder.delete:chSd11c"

🌹正式开始

class Solution {
    public String convert(String s, int numRows) {
    //当行数小于2的时候就一行(就一个字符)直接返回这个字符s就可以了
        if(numRows < 2) return s;
        //下面这两行就是我上面思路所介绍的二维数组
        List<StringBuilder> ans = new ArrayList<StringBuilder>();
        for(int i = 0; i < numRows; i++) ans.add(new StringBuilder());
        //i和flag的搭配让字符串以Z字形输入二维数组详情请看下面的详解
        int i = 0, flag = -1;
        for(char c : s.toCharArray()) {
            ans.get(i).append(c);
            if(i == 0 || i == numRows -1) flag = - flag;
            i += flag;
        }
        //将最后结果归回一个字符串并输出结果
        StringBuilder res = new StringBuilder();
        for(StringBuilder row : ans) res.append(row);
        return res.toString();
    }
}

下面这段代码妙不可言我是借鉴他人的,下面我们就来看看

		int i = 0, flag = -1;
		//将字符串转为字符数组等待一个一个输出
        for(char c : s.toCharArray()) {
            ans.get(i).append(c);
            if(i == 0 || i == numRows -1) flag = - flag;
            i += flag;
        }

这个算法里面i控制这二维数组的行也就是

这两行主要是

 		if(i == 0 || i == numRows -1) flag = - flag;
            i += flag;


我们还以这个为例

好了到这里也讲完了,我们明天再见。

🎃特别介绍:

📣小白练手专栏,适合刚入手的新人欢迎订阅编程小白进阶
📣有什么不明白的欢迎私信或留言,得到细致讲解。另外想要进阶的朋友可以关注练手项目专栏

📣另外想学JavaWeb进厂的同学可以看看这个专栏:传送们
📣是个面试和考研的算法练习我们一起加油上岸之路

以上是关于拿来吧你!⚡考研面试⚡每天练—— Z 字形变换(StringBuilder的用法总结)的主要内容,如果未能解决你的问题,请参考以下文章

⚡考研面试⚡leetcode每天练——无重复字符的最长子串

每日算法/刷穿 LeetCode6. Z 字形变换(中等)

⚡考研面试⚡leetcode每天练——两数相加

⚡考研面试⚡算法每天练——三数之和(中心扩散法)

LeetCode-006-Z 字形变换

剑指Offer 6. Z 字形变换