leetCode——Z字形变换

  1. 题意
    将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。
    比如输入字符串为 “LEETCODEISHIRING” 行数为 3 时,排列如下:
    L C I R
    E T O E S I I G
    E D H N
    之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“LCIRETOESIIGEDHN”。
    请你实现这个将字符串进行指定行数变换的函数:
    string convert(string s, int numRows);
    示例 1:
    输入: s = “LEETCODEISHIRING”, numRows = 3
    输出: “LCIRETOESIIGEDHN”
    示例 2:
    输入: s = “LEETCODEISHIRING”, numRows = 4
    输出: “LDREOEIIECIHNTSG”
    解释:
    在这里插入图片描述
  2. 解题思路:
    方法一:模拟图形构造过程,根据行数构建字符串数据,自上到下,在从下到上,将字符添加到对应行的字符串中,在将字符串数据中的字符串从第0个往后相加,得到排序结果。
    方法二:找规律,z字形是个有周期的排序过程,根据每一个周期的字符数,推断出从第0行到第n-1行每一个字符在字符串s中对应的下标,得到结果。
  3. 代码实现:
	 //方法一
	 public static String convert1(String s, int numRows) {
        String result="";
       String[] ss = new String[numRows];
       for(int j=0;j<numRows;j++){
           ss[j] = "";
       }
       for(int i=0;i<s.length();i++){

           for(int j=0;j<numRows&&i<s.length();j++){
               ss[j] +=s.charAt(i);
               i++;
           }
           for(int j=numRows-2;j>0&&i<s.length();j--){
               ss[j] +=s.charAt(i);
               i++;
           }
           i--;
       }
       for(String string:ss){
           result += string;
       }
       return result;
    }

	//方法二:
    public static String convert2(String s, int numRows) {
        int z = numRows * 2 -2;
        String result = "";
        if (s.length() ==1)
            return s;
        for(int i=0;i<numRows;i++) {
            if(i==0||i==numRows-1) {
                for(int j=i;j<s.length();j+=z) {
                    result+=s.charAt(j);
                }
            }else {
                int t = z - i;
                for(int j=i;j<s.length();j+=z) {
                    result+=s.charAt(j);
                    if(t<s.length()) {
                        result+=s.charAt(t);
                        t+=z;
                    }
                }
            }
        }
        return result;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值