NC344. Z字形输出字符串
描述
示例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; } };