做為年假完恢復信心的題目(?)
題目沒寫要在同一個array內完成,
於是..............
XD?!
Reverse String
char* reverseString(char* s) {
int length = strlen(s);
if (length < 2)
return s;
char *ret = malloc(sizeof(char)*(length+1));
for (int i = 0; i< length; i++)
ret[i] = s[length-1-i];
ret[length]=0;
return ret;
}
寫在同一個array好像也挺快
是真正的easy XD
多了內建的swap即可.
char* reverseString(char* s) {
int length = strlen(s);
if (length < 2)
return s;
for (int i = 0; i< (length/2); i++)
{
char tmp;
tmp = s[length-1-i];
s[length-1-i] = s[i];
s[i] = tmp;
}
return s;
}
20230617 更新
看來這題目也有更新了!輸入參數多了字串長度。
把迴圈裡算尾巴index的部分也先指定起來, j - - 減減之後速度似乎有變快。
不用先去讀 i 的值再來減?!
void reverseString(char* s, int sSize){
char tmp;
int middle = sSize/2;
for (int i=0, j=sSize-i-1;i<middle;i++,j--)
{
tmp=s[i];
s[i]=s[j];
s[j]=tmp;
}
}20260206 更
沒想到~我又回來寫了XD
void swap(char* a, char* b){
char tmp = *a;
*a = *b;
*b = tmp;
}
void reverseString(char* s, int sSize) {
for (int i=0; i<sSize/2; i++)
{
swap ( &s[i], &s[sSize-1-i]);
}
return;
}
[20260226 再再更]
原來不能用strlen(s) 之後再去printf 它!
因為事實上compiler 直接忽略它了QQ 改成以前從來沒懂過使用時機的volatile 就會發現!
volatile int len = strlen(s);
這樣一行就會runtime error了. 也就是s傳進來的時候有可能沒有自帶結束自元 \0
strlen 的寫法是一直讀到\0 為止 , 沒加printf 就沒錯是因為被優化了!根本沒去執行啊啊啊
這種本來就知道的事情竟然到了2026年真的寫到才看到問題Orz 感覺有什麼地方怪怪的Orz
Gemini 建議用pointer 寫法=_=
void reverseString(char* s, int sSize) {
int l=0;
int r=sSize-1;
while (l<r){
char tmp = s[l];
s[l++]= s[r];
s[r--]= tmp;
// l++;
// r--;
}
}
沒有留言:
張貼留言