2018年2月21日 星期三

[344] Reverse String

字串反轉
做為年假完恢復信心的題目(?)
題目沒寫要在同一個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--;
}
}

沒有留言:

張貼留言