Re: [問題] C做字串互換

看板C_and_CPP作者 (私は幸せです)時間7年前 (2016/09/07 00:14), 7年前編輯推噓5(5015)
留言20則, 6人參與, 最新討論串2/2 (看更多)
※ 引述《sagwow (不是我)》之銘言: : 問題(Question): : 字串互換 : 餵入的資料(Input): apple dog : 預期的正確結果(Expected Output):dog apple : 補充說明(Supplement): : 我宣告char a[100][1000],想交換其中a[0]和a[1]兩個字串, : 想請問有沒有不用一個字元一個字元交換的方法。 GitHub Gist: https://gist.github.com/anonymous/ea41f753a335f34a3ec458f730c8f499 不一定要用二維陣列去處理,有 in-place 的 recursive 算法提供參考 大致上的做法就是 先對原字串反轉一次,再對子字串反轉一次就可以了 #include <stdio.h> #include <string.h> char *swapstr_rec(char *str, int begin, int end, int first) { while (begin < end - 1) { char tmp = str[begin]; str[begin++] = str[--end]; str[end] = tmp; } end += begin; if (!first) return NULL; for (int idx = 1, prv = 0; idx <= end; idx++) { if (((str[idx] == ' ' || str[idx] == '\0') ^ (str[idx - 1] == ' ' || str[idx - 1] == '\0'))) swapstr_rec(str, prv, idx, 0), prv = idx; } return str; } char *swapstr(char *str) { return swapstr_rec(str, 0, strlen(str), 1); } int main(void) { char str[] = "apple dog"; printf("%s\n", swapstr(str)); } -- 作者 llyre (r^^||) 看板 Soft_Job 標題 Fw: [台北] 台北360徵Linux/Android安全研究員

07/16 17:40,
推 這間的軟體大家用過都不會移除
07/16 17:40

07/16 17:54,
推 因為都不太知道怎麼移除
07/16 17:54
-- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.243.51.36 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1473178449.A.BE7.html

09/07 15:33, , 1F
感謝,對我來說有點難 研究一下^^a
09/07 15:33, 1F

09/07 16:36, , 2F
我比較推這個處理方法,原理不難啊,就如作者所述
09/07 16:36, 2F

09/07 16:38, , 3F
"123 abc" -swap-> "cba 321" -swap-> "abc 123"
09/07 16:38, 3F

09/07 20:44, , 4F
搭配一樓原原PO的排序程式, 好一個嚇人的字串Bubble Sort...
09/07 20:44, 4F

09/07 23:11, , 5F
leetcode 的 rotate 問題
09/07 23:11, 5F

09/08 02:27, , 6F
總覺得上面那個 recursive 假假的...
09/08 02:27, 6F

09/08 02:28, , 7F
把 first=0 獨立拉成一個 sub-function, 就不 revursive 了啊
09/08 02:28, 7F

09/08 03:07, , 8F
沒有吧~ 這確實算是 tail recursion 不是嗎?
09/08 03:07, 8F

09/08 03:08, , 9F
然後重用了上半部分 swap 的 code
09/08 03:08, 9F

09/08 03:09, , 10F
09/08 03:09, 10F

09/08 03:11, , 11F
確實這也很容易轉寫成迭代的形式 都可以啦 不重要
09/08 03:11, 11F

09/08 03:12, , 12F
我比較好奇這 code 有什麼實際的應用
09/08 03:12, 12F

09/08 03:12, , 13F
原原PO好像要的不是這個 我後來才發現 wwwwwww
09/08 03:12, 13F

09/08 03:13, , 14F
他好像需要的是 swap 任意的子字串 而不是整個的說
09/08 03:13, 14F
※ 編輯: Hazukashiine (1.160.123.188), 09/08/2016 03:14:44

09/08 03:18, , 15F
我終於知道為什麼會這個遞迴看起來假假的了
09/08 03:18, 15F

09/08 03:19, , 16F
其實就把它想像成邊界條件是層數為一的遞迴就可以了
09/08 03:19, 16F

09/08 03:21, , 17F
這樣是不是就有一般遞迴的 feel 惹 (づ′・ω・)づ
09/08 03:21, 17F

09/08 13:33, , 18F
不是 tail recursion. f(n) 最後叫用 f(k) 來結束 f(n) 才是.
09/08 13:33, 18F

09/08 13:34, , 19F
而你的 swapstr_rec() 最後是 return str;
09/08 13:34, 19F

09/08 14:39, , 20F
這樣的做法做了二次的swap好像沒比較快
09/08 14:39, 20F
文章代碼(AID): #1NpkjHld (C_and_CPP)
文章代碼(AID): #1NpkjHld (C_and_CPP)