[閒聊] C語言大師請進

看板Marginalman作者 (caster)時間2年前 (2022/12/29 23:54), 2年前編輯推噓15(15032)
留言47則, 13人參與, 2年前最新討論串9/14 (看更多)
今天刷題遇到一個問題 原本我的for迴圈寫成這樣 for(int j=0 ; j<strlen(t); j++) 結果無法通過測試 改成for(; j<strlen(t); j++) 把int j=0放到前面就過了 這兩個有什麼差別嗎? 完整程式碼如下: C code ------------------ #include <string.h> bool isSubsequence(char * s, char * t){ int m=0; int j=0; for(int i=0; i<strlen(s); i++){ for(; j<strlen(t); j++){ if(s[i] == t[j]){ j++; m++; break; } } if(i == m){ return 0; } } return 1; } ------------------- -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.43.94.104 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Marginalman/M.1672329290.A.5B3.html

12/29 23:55, 2年前 , 1F
差在哪
12/29 23:55, 1F

12/29 23:56, 2年前 , 2F
沒差吧
12/29 23:56, 2F

12/29 23:57, 2年前 , 3F
我也覺得沒差 可是解答跟我唯一的差別就在這裡
12/29 23:57, 3F

12/29 23:57, 2年前 , 4F
改完就過了 完全不能理解
12/29 23:57, 4F

12/29 23:57, 2年前 , 5F
C99才開始支援上面的寫法 用C89會編不過
12/29 23:57, 5F

12/29 23:57, 2年前 , 6F
編譯器比較老?
12/29 23:57, 6F

12/29 23:58, 2年前 , 7F
ㄚ 最後一次會超出strlen的邊界
12/29 23:58, 7F

12/29 23:58, 2年前 , 8F
應該吧
12/29 23:58, 8F

12/29 23:58, 2年前 , 9F
大師!
12/29 23:58, 9F

12/29 23:58, 2年前 , 10F
我在leetcode上面跑 感覺應該是C99吧?
12/29 23:58, 10F

12/29 23:58, 2年前 , 11F
我看錯了 沒事
12/29 23:58, 11F

12/29 23:58, 2年前 , 12F
我好爛:(
12/29 23:58, 12F

12/29 23:59, 2年前 , 13F
而且我前面的i也用第一種寫法 沒改也沒問題
12/29 23:59, 13F

12/29 23:59, 2年前 , 14F
靠北 原來下面還有一段 這樣你j在外面迴圈不會歸0
12/29 23:59, 14F

12/29 23:59, 2年前 , 15F
沒關係 我比你更爛
12/29 23:59, 15F

12/30 00:00, 2年前 , 16F
但他的i是放在迴圈裡宣告的,照理來說的話會連i也有問
12/30 00:00, 16F

12/30 00:00, 2年前 , 17F
12/30 00:00, 17F

12/30 00:01, 2年前 , 18F
區域變數在外面會死翹翹的意思嗎?
12/30 00:01, 18F

12/30 00:02, 2年前 , 19F
我菜雞都宣告全域變數交作業-.-
12/30 00:02, 19F

12/30 00:04, 2年前 , 20F
不知道會不會跟if裡的j++有關係,但照理來說在迴圈裡宣
12/30 00:04, 20F

12/30 00:04, 2年前 , 21F
告的話,放在迴圈裡跑也沒事
12/30 00:04, 21F

12/30 00:05, 2年前 , 22F
j不能每次都歸零ㄚ 不然會抓到重複的t[j]
12/30 00:05, 22F

12/30 00:05, 2年前 , 23F
真假 這樣寫會每次都歸零喔?
12/30 00:05, 23F

12/30 00:06, 2年前 , 24F
j的值不是會繼承下來嗎?
12/30 00:06, 24F

12/30 00:06, 2年前 , 25F
解答不會 你放在迴圈裡會
12/30 00:06, 25F

12/30 00:06, 2年前 , 26F
原來你不要歸0 :0
12/30 00:06, 26F

12/30 00:07, 2年前 , 27F
*放在for裡
12/30 00:07, 27F

12/30 00:07, 2年前 , 28F
對 我不要歸零 因為我要找出字的順序
12/30 00:07, 28F

12/30 00:07, 2年前 , 29F
我等等發一篇我的思路
12/30 00:07, 29F

12/30 00:08, 2年前 , 30F
原來 感謝大佬 我等等發錢
12/30 00:08, 30F

12/30 00:10, 2年前 , 31F
宣告int要在上面 不然有些compiler不會過
12/30 00:10, 31F

12/30 00:10, 2年前 , 32F
宣告放在迴圈裡 兔了
12/30 00:10, 32F

12/30 00:11, 2年前 , 33F
靠北 那為啥i就可以
12/30 00:11, 33F

12/30 00:11, 2年前 , 34F
我都塞在裡面 我好爛:0
12/30 00:11, 34F

12/30 00:12, 2年前 , 35F
確實 為啥i不會歸零?
12/30 00:12, 35F

12/30 00:12, 2年前 , 36F
不要for已經j++了 迴圈裡面還j++
12/30 00:12, 36F

12/30 00:13, 2年前 , 37F
都塞裡面+1 哇哇嗚嗚嗚
12/30 00:13, 37F

12/30 00:16, 2年前 , 38F
i從0到strlen(s) 本來就不會歸零
12/30 00:16, 38F

12/30 00:16, 2年前 , 39F
用你原本的寫法
12/30 00:16, 39F

12/30 00:16, 2年前 , 40F
j是外層迴圈跑下一輪的時候會歸零
12/30 00:16, 40F
感謝大師

12/30 00:22, 2年前 , 41F
你的過不過是指能不能編譯還是答案正不正確
12/30 00:22, 41F
答案正不正確 ※ 編輯: sustainer123 (223.137.14.32 臺灣), 12/30/2022 00:28:07

12/30 13:15, 2年前 , 42F
上面有人說對了,ANSI C, C89 不能在 for 的括弧宣告變
12/30 13:15, 42F

12/30 13:15, 2年前 , 43F
數,但基本上現代編譯器應該都預設 C99 以上
12/30 13:15, 43F

12/30 13:15, 2年前 , 44F
還有一點提醒 for (j = 0; j < strlen(s); j++) 是很不
12/30 13:15, 44F

12/30 13:15, 2年前 , 45F
好的寫法,因為每次 strlen() 都是 O(N), 這樣會讓原本
12/30 13:15, 45F

12/30 13:15, 2年前 , 46F
for 的時間複雜度多一個 N, 可以把長度記起來,或是以
12/30 13:15, 46F

12/30 13:15, 2年前 , 47F
指標遍歷 string, 因為 C-string 本來就是陣列與指標
12/30 13:15, 47F
文章代碼(AID): #1ZhRXAMp (Marginalman)
討論串 (同標題文章)
文章代碼(AID): #1ZhRXAMp (Marginalman)