首页 > 试题广场 >

Z字形输出字符串

[编程题]Z字形输出字符串
  • 热度指数:626 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个长度为 n 的字符串和一个指定行数 k ,请你从上到下,从左到右地把这个字符串转换成 z 字形,一共 n 行。

例如输入的字符串是 "nowcoder",k=3,则转换成的 z 字形是
n  o
ocdr
w e
然后返回这个新字符串,noocdrwe

数据范围: ,字符串中仅包含小写英文字母。
示例1

输入

"nowcoder",3

输出

"noocdrwe"
class Solution:
    def zconvert(self , str: str, k: int) -> str:
        res=""
        for i in range(k):
            for j in self.getNum(i,k,len(str)):
                res+=str[j]
        return res
            
    def getNum(self,i,k,l):
        delta=2*(k-1)
        p=i
        while True:
            yield p
            p=int(p/delta+1.5)*delta-p%delta
            if p>=l:
                break

发表于 2022-09-24 16:20:33 回复(0)
class Solution {
public:
    string zconvert(string str, int k) {
        int length=str.size();
        if (k==1) return str;
        vector<string> rows(min(length, k));
        bool flag=false;
        int i=0;
        for (char c:str) {
            rows[i]+=c;
            if (i==0 || i==k-1) flag=!flag;
            i+=flag?1:-1;
        }
        string result;
        for (auto row:rows) result+=row;
        return result;
    }
};

发表于 2022-08-18 20:34:10 回复(0)
我用的是直接构造法,把字符列出来写出行数找规律,比如n是在第一行,o在第二行,两层循环,第一层循环是k次,因为只有k行,后面的都是重复,第二层循环的结束条件就是看有没有到字符串的最后一个。
char* zconvert(char* str, int k ) {
    int length = strlen(str)+1;
    if (k == 1||k>=length-1)
        return str;
    int a = 0;
    char* str1 = (char*)malloc(sizeof(char) * length);
    memset(str1, '\0', length);
    int cycle = 2 * k - 2;
    for (int i = 0; i < k; i++) {
        char* str2 = str + i;
        int c = 0;
        int flag = 0;
        while (c <=strlen(str)-1-i) {
            str1[a++] = *(str2+c);
            if (i == 0 || i == k - 1)
                c += cycle;
            else if (flag == 0) {
                c += cycle - i * 2;
                flag = 1;
            }
            else {                
                c += i*2;
                flag = 0;
            }
        }
    }
    str1[a] = '\0';
    return str1;
}

发表于 2022-06-08 21:35:02 回复(0)