<td id="aqqih"></td>

<dd id="aqqih"></dd>
  1. <span id="aqqih"></span>
  2. <ol id="aqqih"></ol>

    C++怎么實現字型轉換字符串

    這篇文章主要介紹“C++怎么實現字型轉換字符串”,在日常操作中,相信很多人在C++怎么實現字型轉換字符串問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”C++怎么實現字型轉換字符串”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

    Example 1:

    Input: s = "PAYPALISHIRING", numRows = 3
    Output: "PAHNAPLSIIGYIR"

    Example 2:

    Input: s = "PAYPALISHIRING", numRows =?4
    Output:?"PINALSIGYAHRPI"
    Explanation:

    P???? I??? N
    A?? L S? I G
    Y A?? H R
    P???? I

    這道題剛開始看了半天沒看懂是咋樣變換的,上網查了些資料,終于搞懂了,就是要把字符串擺成一個之字型的,比如有一個字符串 "0123456789ABCDEF",轉為 zigzag 如下所示:

    當 n = 2 時:

    0 2 4 6 8 A C E

    1 3 5 7 9 B D F

    當 n = 3 時:

    0 ? 4 ? ?8 ? ? C

    1 3 5 7 9 B D F

    2 ? ?6 ? A ? ? E

    當 n = 4 時:

    0 ? ? 6 ? ? ? ?C

    1 ? 5 7 ? B ?D

    2 4 ? 8 A ? ?E

    3 ? ? ?9 ? ? ? F

    可以發現,除了第一行和最后一行沒有中間形成之字型的數字外,其他都有,而首位兩行中相鄰兩個元素的 index 之差跟行數是相關的,為? 2*nRows - 2, 根據這個特點,可以按順序找到所有的黑色元素在元字符串的位置,將他們按順序加到新字符串里面。對于紅色元素出現的位置(Github 上可能無法正常顯示顏色,請參見博客園上的帖子)也是有規律的,每個紅色元素的位置為 j + 2 x numRows-2 - 2 x i, 其中,j為前一個黑色元素的 index,i為當前行數。 比如當 n = 4 中的那個紅色5,它的位置為 1 + 2 x 4-2 - 2 x 1 = 5,為原字符串的正確位置。知道了所有黑色元素和紅色元素位置的正確算法,就可以一次性的把它們按順序都加到新的字符串里面。代碼如下:

    解法一:

    class?Solution?{
    public:
    ????string?convert(string?s,?int?numRows)?{
    ????????if?(numRows?<=?1)?return?s;
    ????????string?res;
    ????????int?size?=?2?*?numRows?-?2,?n?=?s.size();
    ????????for?(int?i?=?0;?i?<?numRows;?++i)?{
    ????????????for?(int?j?=?i;?j?<?n;?j?+=?size)?{
    ????????????????res?+=?s[j];
    ????????????????int?pos?=?j?+?size?-?2?*?i;
    ????????????????if?(i?!=?0?&&?i?!=?numRows?-?1?&&?pos?<?n)?res?+=?s[pos];
    ????????????}
    ????????}
    ????????return?res;
    ????}
    };

    若上面解法中的規律不是很好想的話,我們也可以用下面這種更直接的方法來做,建立一個大小為 numRows 的字符串數組,為的就是把之字形的數組整個存進去,然后再把每一行的字符拼接起來,就是想要的結果了。順序就是按列進行遍歷,首先前 numRows 個字符就是按順序存在每行的第一個位置,然后就是 ‘之" 字形的連接位置了,可以發現其實都是在行數區間 [1, numRows-2] 內,只要按順序去取字符就可以了,最后把每行都拼接起來即為所求,參見代碼如下:

    解法二:

    class?Solution?{
    public:
    ????string?convert(string?s,?int?numRows)?{
    ????????if?(numRows?<=?1)?return?s;
    ????????string?res;
    ????????int?i?=?0,?n?=?s.size();
    ????????vector<string>?vec(numRows);
    ????????while?(i?<?n)?{
    ????????????for?(int?pos?=?0;?pos?<?numRows?&&?i?<?n;?++pos)?{
    ????????????????vec[pos]?+=?s[i++];
    ????????????}
    ????????????for?(int?pos?=?numRows?-?2;?pos?>=?1?&&?i?<?n;?--pos)?{
    ????????????????vec[pos]?+=?s[i++];
    ????????????}
    ????????}
    ????????for?(auto?&a?:?vec)?res?+=?a;
    ????????return?res;
    ????}
    };

    到此,關于“C++怎么實現字型轉換字符串”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注蝸牛博客網站,小編會繼續努力為大家帶來更多實用的文章!

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

    評論

    日本韩欧美一级A片在线观看
    <td id="aqqih"></td>

    <dd id="aqqih"></dd>
    1. <span id="aqqih"></span>
    2. <ol id="aqqih"></ol>