2024年7月13日 星期六

[1328] Break a Palindrome

沒天份代表在此~(體操選手上場前被唱名是單手高舉微點頭貌)

想說要先偷看到底會不會找不到前半段的a (好繞口)
但後來發現根本不用偷看啊!
接著就想說那整個字串都跑好了,反正就是找第一個non a 填入a !
如此一來要避開奇數長度的middle 不管是什麼字母都沒有差別的情況
於是算了一個mid = true or flase 來避開,
然後又發現到了後半的話,要變成從最後面去改成b !
因為- 如果已經跑到了後半,表示它前半和後半都是a!
根據題意,如果切兩半來看,要換成a的時候是位置越前面越好
而如果他們通通都是a,我要把其中一個改成b ,反而是越後面越好!
那又所以直接把最尾巴改成a 就可以了!
於是就寫好了,還在沾沾自喜的時候,發現根本不用特別考慮middle 的位置= =
討厭XD

原本版本:
char* breakPalindrome(char* palindrome) {
int len = strlen(palindrome);
if (len ==1)
return "";
bool middle = (len%2==0)?false:true;
int mid = len/2;
for (int i=0; i<len; i++)
{
char now = palindrome[i];
if ((now !='a' && !middle) ||
(now !='a' && middle && i!=mid))
{
palindrome[i] = 'a';
return palindrome;
}
}
palindrome[len-1] = 'b';
return palindrome;
}

改進版本: 
char* breakPalindrome(char* palindrome) {
int len = strlen(palindrome);
if (len ==1)
return "";
int mid = len/2;
for (int i=0; i<mid; i++)
{
char now = palindrome[i];
if (now !='a')
{
palindrome[i] = 'a';
return palindrome;
}
}
palindrome[len-1] = 'b';
return palindrome;
}

然後發現速度也沒有比較快啊XD 改心酸的嗎

沒有留言:

張貼留言