给定一个长度为 n 的字符串和一个指定行数 k ,请你从上到下,从左到右地把这个字符串转换成 z 字形,一共 n 行。
例如输入的字符串是 "nowcoder",k=3,则转换成的 z 字形是
n o
ocdr
w e
然后返回这个新字符串,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
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; } };
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; }