列表

详情


NC344. Z字形输出字符串

描述

给定一个长度为 n 的字符串和一个指定行数 k ,请你从上到下,从左到右地把这个字符串转换成 z 字形,一共 n 行。

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

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

示例1

输入:

"nowcoder",3

输出:

"noocdrwe"

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C 解法, 执行用时: 6ms, 内存消耗: 780KB, 提交时间: 2022-06-27

char* zconvert(char* str, int k ) {
    int n = strlen(str), r = k;
    if (r == 1 || r >= n) {
        return str;
    }

    int t = r * 2 - 2;
    char* z = (char*)malloc(sizeof(char) * (n + 1));
    int p = 0;
    for (int i = 0; i < r; ++i) {
        for (int j = 0; j + i < n; j += t) {
            z[p++] = str[j + i];
            if (0 < i && i < r - 1 && j + t - i < n) {
                z[p++] = str[j + t - i];
            }
        }
    }
    z[p] = '\0';
    return z;
}

C 解法, 执行用时: 6ms, 内存消耗: 808KB, 提交时间: 2022-03-13

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param str string字符串 
 * @param k int整型 
 * @return string字符串
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */
char* zconvert(char* str, int k ) {
    // write code here
    int n = strlen(str), r = k;
    if (r == 1 || r >= n) {
        return str;
    }
    int t = r * 2 - 2;
    char * ans = (char *)malloc(sizeof(char) * (n + 1));
    int pos = 0;
    for (int i = 0; i < r; ++i) { // 枚举矩阵的行
        for (int j = 0; j + i < n; j += t) { // 枚举每个周期的起始下标
            ans[pos++] = str[j + i]; // 当前周期的第一个字符
            if (0 < i && i < r - 1 && j + t - i < n) {
                ans[pos++] = str[j + t - i]; // 当前周期的第二个字符
            }
        }
    }
    ans[pos] = '\0';
    return ans;
/*
    int length = strlen(str);
    
    if (length == 1 || k > length) {
        return str;
    }
    
    int t = 2 * k - 2; //周期
    int c = (length + t - 1) / t * (k - 1); // 列数
    char **mat = (char **) malloc(sizeof(char *) * k);
    for (int i = 0; i < k; i++) {
        mat[i] = (char *) malloc(sizeof(char) * c);
        memset(mat[i], 0, sizeof(char) * c);
    }
    
    for (int i = 0, x = 0, y = 0; i < length; i++) {
        mat[x][y] = str[i];
        if (i % t < k - 1) {
            ++x;
        } else {
            --x;
            ++y;
        }
    }
    
    int count = 0;
    for (int i = 0; i < k; i++) {
        for (int j = 0; j < c; j++) {
            if (mat[i][j]) {
                str[count++] = mat[i][j];
            }
        }
    }
    
    return str;
*/
}

C++ 解法, 执行用时: 6ms, 内存消耗: 1024KB, 提交时间: 2022-06-26

class Solution {
  public:
    string zconvert(string str, int k) {
        const int n = str.size();
        int t = 2 * k - 2;
        string z(str);
        int m = 0;        
        for (int i = 0; i < k; i++) {
            for (int j = 0; j < n; j += t) {
                if (i == 0) {
                    z[m] = str[j];
                    m++;
                } else if (i == k - 1) {
                    if (j + i < n) {
                        z[m] = str[j + i];
                        m++;
                    }
                } else {
                    if (j + i < n) {
                        z[m] = str[j + i];
                        m++;
                    }
                    if (j + t - i < n) {
                        z[m] = str[j + t - i];
                        m++;
                    }
                }

            }
        }
        return z;
    }
};

C++ 解法, 执行用时: 6ms, 内存消耗: 1036KB, 提交时间: 2022-05-26

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param str string字符串 
     * @param k int整型 
     * @return string字符串
     */
    string zconvert(string str, int k) {
        // write code here
        const int n=str.length();
        int t=2*k-2;
        string ans(str);
        int m=0;
        for(int i=0;i<k;i++)
        {
            for(int j=0;j<n;j+=t)
            {
                if(i==0)
                {
                    ans[m]=str[j];m++;
                }
                else if(i==k-1)
                {
                    if(j+i<n)
                    {
                        ans[m]=str[j+i];m++;
                    }
                }
                else
                {
                    if(j+i<n)
                    {
                        ans[m]=str[j+i];
                        m++;
                    }
                    if(j+t-i<n)
                    {
                        ans[m]=str[j+t-i];m++;
                    }
                }
                
            }
        }
        return ans;
    }
};

C++ 解法, 执行用时: 6ms, 内存消耗: 1040KB, 提交时间: 2022-03-16

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param str string字符串 
     * @param k int整型 
     * @return string字符串
     */
    string zconvert(string str, int k) {
        // write code here
        if(k >= str.size()){
            return str;
        }
        std::string res;
        int max_step = k - 1 << 1;
        for(int i = 0; i < k; i++){
            int j = i;
            int step = k - i - 1 << 1;
            while(j < str.size()){
                res += str[j];
                if(step == 0){
                    step = max_step - step;
                }
                j += step;
                step = max_step - step;
            }
        }
        return res;
    }
};

上一题