91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言怎么實現Z字形變換排列

發布時間:2022-04-24 14:12:16 來源:億速云 閱讀:143 作者:iii 欄目:開發技術

本篇內容介紹了“C語言怎么實現Z字形變換排列”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

題目鏈接:Z 字形變換

C語言怎么實現Z字形變換排列

方法一

——找規律模擬數組

題目要求構造一個從左到右的Z型矩陣。

通過分析,可以看出這個Z型矩陣的特點

C語言怎么實現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)

方法二

&mdash;&mdash;壓縮矩陣

在第一種方法,需要構造一個二維矩陣,但是其實只使用了其中的部分空間,這樣就導致浪費了許多空間,因此可以對矩陣進行壓縮。

依舊是將矩陣只有一行的情況進行額外討論,若成立,直接返回原字符串。 反之,創建一個r行1列的的string數組,通過判斷字符i的位置(與第一種方法的判斷方式一樣),直接將字符填寫到數組的對應行。 舉例說明:

C語言怎么實現Z字形變換排列

這個Z型字符在模擬數組是這樣呈現的:

C語言怎么實現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)

“C語言怎么實現Z字形變換排列”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

南涧| 勐海县| 邢台县| 扬州市| 敦煌市| 彰武县| 临汾市| 云林县| 潜江市| 阳谷县| 潞城市| 乐都县| 蚌埠市| 朝阳县| 思茅市| 农安县| 大厂| 甘南县| 阿坝县| 辽宁省| 田阳县| 繁峙县| 长宁区| 政和县| 汉阴县| 宝鸡市| 昌都县| 临洮县| 鹤庆县| 济源市| 若尔盖县| 大关县| 竹山县| 白城市| 句容市| 伊吾县| 遂平县| 盐津县| 资讯| 修水县| 昌宁县|