C語言詳解Z字形變換排列的實(shí)現(xiàn)
題目鏈接:Z 字形變換

方法一
——找規(guī)律模擬數(shù)組
題目要求構(gòu)造一個(gè)從左到右的Z型矩陣。
通過分析,可以看出這個(gè)Z型矩陣的特點(diǎn)

Z型矩陣就是如圖中的橙色,綠色這樣部分組合在一起的,Z型矩陣就是由一個(gè)個(gè)這樣相同周期組成的。
這里有一種情況需要特殊討論,當(dāng)矩陣只有一行時(shí),直接返回原字符。
其余情況均可滿足。
其周期的構(gòu)成滿足這樣一個(gè)規(guī)律:
在第一列向下填寫矩陣行數(shù)r個(gè)字符,接著向其右上部分共(r-2)列分別填寫一個(gè)字符。Z型矩陣的周期t=r+r-2=2*r-2,每個(gè)周期會占用矩陣的r-1列,總共有 字符長度len/t個(gè)周期(將最后一個(gè)周期視作完整周期)。
因此創(chuàng)建一個(gè)具有r行c列的的二維矩陣,(這里在計(jì)算列的時(shí)候需要多+一個(gè)周期,因?yàn)槌ǖ挠?jì)算會舍去余數(shù))。一開始從(0,0)這個(gè)位置開始填寫字符,通過判斷i%t與r-1的大小決定向上移動還是向下移動。
共兩種情況:
i%t<r-1 :說明這時(shí)矩陣正在填寫第一列的數(shù)字,這時(shí)只需要向下移動
i%t>=r-1:說明第一列已經(jīng)填寫好了,這時(shí)需要向右上方進(jìn)行填寫字符,所以需要向右移動一位,向上移動一位。
當(dāng)一個(gè)周期運(yùn)行完時(shí),又會回到新周期的第一列。
再次遍歷矩陣,將存儲有字符的位置加入到一個(gè)新的字符串中。
class Solution {
public:
string convert(string s, int numRows) {
if(numRows==1||numRows>=s.size())//特殊情況進(jìn)行排除
return s;
int r=numRows;//矩陣的行數(shù)
int t=2*r-2;//周期所含字符個(gè)數(shù)
int len=s.size();//字符串的長度
int c=(len+t)/t*(r-1);//二維矩陣列數(shù)
vector<string> v1 (r,string(c,0));
for(int i=0, x=0,y=0;i<len;i++){
v1[x][y]=s[i];
if(i%t<r-1){
x++;//向下移動
}
else{
x--;//向上移動
y++;//向右移動
}
}
string ans;
for(int i=0;i<r;i++){//遍歷矩陣,掃描字符并添加
for(int j=0;j<c;j++){
if(v1[i][j])
ans+=v1[i][j];
}
}
return ans;
}
};
時(shí)間復(fù)雜度=o(nr)
空間復(fù)雜度=o(nr)
方法二
——壓縮矩陣
在第一種方法,需要構(gòu)造一個(gè)二維矩陣,但是其實(shí)只使用了其中的部分空間,這樣就導(dǎo)致浪費(fèi)了許多空間,因此可以對矩陣進(jìn)行壓縮。
依舊是將矩陣只有一行的情況進(jìn)行額外討論,若成立,直接返回原字符串。 反之,創(chuàng)建一個(gè)r行1列的的string數(shù)組,通過判斷字符i的位置(與第一種方法的判斷方式一樣),直接將字符填寫到數(shù)組的對應(yīng)行。 舉例說明:

這個(gè)Z型字符在模擬數(shù)組是這樣呈現(xiàn)的:

class Solution {
public:
string convert(string s, int numRows) {
int len=s.size();//字符串長度
int r=numRows;//矩陣行數(shù)
int t=2*r-2;//周期所含字符個(gè)數(shù)
if (r == 1) {
return s;
}
vector<string> v1(r);
int x=0;
for(int i=0;i<len;i++){
v1[x]+=s[i];
if(i%t<r-1)
x++;//向下移動
else
x--;//向上移動
}
string ans;
for (auto &row : v1) {//遍歷矩陣,掃描字符并添加
ans += row;
}
return ans;
}
};
時(shí)間復(fù)雜度:o(n)
空間復(fù)雜度:o(n)
到此這篇關(guān)于C語言詳解Z字形變換排列的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)C語言Z字形變換內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vscode實(shí)現(xiàn)本地代碼自動同步到遠(yuǎn)程機(jī)器的步驟
這篇文章主要介紹了vscode實(shí)現(xiàn)本地代碼自動同步到遠(yuǎn)程機(jī)器的步驟,本文分步驟給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06
c++基礎(chǔ)語法:構(gòu)造函數(shù)初始化列表
構(gòu)造函數(shù)需要初始化的數(shù)據(jù)成員,不論是否顯示的出現(xiàn)在構(gòu)造函數(shù)的成員初始化列表中,都會在該處完成初始化,并且初始化的順序和其在聲明時(shí)的順序是一致的,與列表的先后順序無關(guān)2013-09-09
C++ 數(shù)據(jù)結(jié)構(gòu)之對稱矩陣及稀疏矩陣的壓縮存儲
這篇文章主要介紹了C++ 數(shù)據(jù)結(jié)構(gòu)之對稱矩陣及稀疏矩陣的壓縮存儲的相關(guān)資料,這里實(shí)現(xiàn)稀疏矩陣和對稱矩陣的壓縮存儲的實(shí)例,需要的朋友可以參考下2017-08-08
C++實(shí)現(xiàn)LeetCode(19.移除鏈表倒數(shù)第N個(gè)節(jié)點(diǎn))
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(19.移除鏈表倒數(shù)第N個(gè)節(jié)點(diǎn)),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
VSCode添加頭文件(C/C++)的實(shí)現(xiàn)示例
這篇文章主要介紹了VSCode添加頭文件(C/C++)的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08

