網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
題目鏈接:Z 字形變換
方法一
——找規(guī)律模擬數(shù)組
題目要求構(gòu)造一個(gè)從左到右的Z型矩陣。
通過(guò)分析,可以看出這個(gè)Z型矩陣的特點(diǎn)
Z型矩陣就是如圖中的橙色,綠色這樣部分組合在一起的,Z型矩陣就是由一個(gè)個(gè)這樣相同周期組成的。
這里有一種情況需要特殊討論,當(dāng)矩陣只有一行時(shí),直接返回原字符。
其余情況均可滿(mǎn)足。
其周期的構(gòu)成滿(mǎn)足這樣一個(gè)規(guī)律:
在第一列向下填寫(xiě)矩陣行數(shù)r個(gè)字符,接著向其右上部分共(r-2)列分別填寫(xiě)一個(gè)字符。Z型矩陣的周期t=r+r-2=2*r-2,每個(gè)周期會(huì)占用矩陣的r-1列,總共有 字符長(zhǎng)度len/t個(gè)周期(將最后一個(gè)周期視作完整周期)。
因此創(chuàng)建一個(gè)具有r行c列的的二維矩陣,(這里在計(jì)算列的時(shí)候需要多+一個(gè)周期,因?yàn)槌ǖ挠?jì)算會(huì)舍去余數(shù))。一開(kāi)始從(0,0)這個(gè)位置開(kāi)始填寫(xiě)字符,通過(guò)判斷i%t與r-1的大小決定向上移動(dòng)還是向下移動(dòng)。
共兩種情況:
i%t<r-1 :說(shuō)明這時(shí)矩陣正在填寫(xiě)第一列的數(shù)字,這時(shí)只需要向下移動(dòng)
i%t>=r-1:說(shuō)明第一列已經(jīng)填寫(xiě)好了,這時(shí)需要向右上方進(jìn)行填寫(xiě)字符,所以需要向右移動(dòng)一位,向上移動(dòng)一位。
當(dāng)一個(gè)周期運(yùn)行完時(shí),又會(huì)回到新周期的第一列。
再次遍歷矩陣,將存儲(chǔ)有字符的位置加入到一個(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();//字符串的長(zhǎng)度
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++;//向下移動(dòng)
}
else{
x--;//向上移動(dòng)
y++;//向右移動(dòng)
}
}
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)了許多空間,因此可以對(duì)矩陣進(jìn)行壓縮。
依舊是將矩陣只有一行的情況進(jìn)行額外討論,若成立,直接返回原字符串。 反之,創(chuàng)建一個(gè)r行1列的的string數(shù)組,通過(guò)判斷字符i的位置(與第一種方法的判斷方式一樣),直接將字符填寫(xiě)到數(shù)組的對(duì)應(yīng)行。 舉例說(shuō)明:
這個(gè)Z型字符在模擬數(shù)組是這樣呈現(xiàn)的:
class Solution {
public:
string convert(string s, int numRows) {
int len=s.size();//字符串長(zhǎng)度
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++;//向下移動(dòng)
else
x--;//向上移動(dòng)
}
string ans;
for (auto &row : v1) {//遍歷矩陣,掃描字符并添加
ans += row;
}
return ans;
}
};
時(shí)間復(fù)雜度:o(n)
空間復(fù)雜度:o(n)
原文鏈接:https://blog.csdn.net/weixin_59112191/article/details/123238696
相關(guān)推薦
- 2022-02-20 uni-app checkbox全選功能
- 2023-07-10 如何使用MyBatis框架實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的增刪查改?
- 2022-05-02 構(gòu)建及部署jenkins?pipeline實(shí)現(xiàn)持續(xù)集成持續(xù)交付腳本_服務(wù)器其它
- 2022-08-12 Qt實(shí)現(xiàn)電子時(shí)鐘_C 語(yǔ)言
- 2022-09-23 C#實(shí)現(xiàn)自定義光標(biāo)并動(dòng)態(tài)切換_C#教程
- 2022-05-13 C++ 使用Poco庫(kù)實(shí)現(xiàn)XML的讀取和寫(xiě)入
- 2022-04-03 Go語(yǔ)言讀取txt文檔的操作方法_Golang
- 2022-10-21 Go語(yǔ)言使用goroutine及通道實(shí)現(xiàn)并發(fā)詳解_Golang
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支