網站首頁 編程語言 正文
題目鏈接:Z 字形變換
方法一
——找規律模擬數組
題目要求構造一個從左到右的Z型矩陣。
通過分析,可以看出這個Z型矩陣的特點
Z型矩陣就是如圖中的橙色,綠色這樣部分組合在一起的,Z型矩陣就是由一個個這樣相同周期組成的。
這里有一種情況需要特殊討論,當矩陣只有一行時,直接返回原字符。
其余情況均可滿足。
其周期的構成滿足這樣一個規律:
在第一列向下填寫矩陣行數r個字符,接著向其右上部分共(r-2)列分別填寫一個字符。Z型矩陣的周期t=r+r-2=2*r-2,每個周期會占用矩陣的r-1列,總共有 字符長度len/t個周期(將最后一個周期視作完整周期)。
因此創建一個具有r行c列的的二維矩陣,(這里在計算列的時候需要多+一個周期,因為除法的計算會舍去余數)。一開始從(0,0)這個位置開始填寫字符,通過判斷i%t與r-1的大小決定向上移動還是向下移動。
共兩種情況:
i%t<r-1 :說明這時矩陣正在填寫第一列的數字,這時只需要向下移動
i%t>=r-1:說明第一列已經填寫好了,這時需要向右上方進行填寫字符,所以需要向右移動一位,向上移動一位。
當一個周期運行完時,又會回到新周期的第一列。
再次遍歷矩陣,將存儲有字符的位置加入到一個新的字符串中。
class Solution {
public:
string convert(string s, int numRows) {
if(numRows==1||numRows>=s.size())//特殊情況進行排除
return s;
int r=numRows;//矩陣的行數
int t=2*r-2;//周期所含字符個數
int len=s.size();//字符串的長度
int c=(len+t)/t*(r-1);//二維矩陣列數
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;
}
};
時間復雜度=o(nr)
空間復雜度=o(nr)
方法二
——壓縮矩陣
在第一種方法,需要構造一個二維矩陣,但是其實只使用了其中的部分空間,這樣就導致浪費了許多空間,因此可以對矩陣進行壓縮。
依舊是將矩陣只有一行的情況進行額外討論,若成立,直接返回原字符串。 反之,創建一個r行1列的的string數組,通過判斷字符i的位置(與第一種方法的判斷方式一樣),直接將字符填寫到數組的對應行。 舉例說明:
這個Z型字符在模擬數組是這樣呈現的:
class Solution {
public:
string convert(string s, int numRows) {
int len=s.size();//字符串長度
int r=numRows;//矩陣行數
int t=2*r-2;//周期所含字符個數
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;
}
};
時間復雜度:o(n)
空間復雜度:o(n)
原文鏈接:https://blog.csdn.net/weixin_59112191/article/details/123238696
相關推薦
- 2022-11-19 Python變量和數據類型和數據類型的轉換_python
- 2022-08-28 Oracle觸發器和程序包的基本介紹_oracle
- 2022-07-10 css盒子塌陷及其解決方法
- 2022-11-21 Go語言讀寫鎖RWMutex的源碼分析_Golang
- 2023-07-04 SpringBoot不在使用@Validated 做參數校驗但是不想在Controller層怎么辦?
- 2022-09-18 Go語言實現文件上傳_Golang
- 2022-04-26 使用jquery庫實現電梯導航效果_jquery
- 2022-10-17 多階段構建優化Go?程序Docker鏡像_Golang
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支