2024年8月11日 星期日

[394] Decode String

唉~(先嘆一口長氣)
之前有看到這題,但後來覺得麻煩就沒寫 XD
沒想到面試被考這題,而我陷入panic XD 好丟臉啊~(遮臉)
反正就這樣吧Orz 

據說有recursive 的寫法,不過看起來return string 的地方會很瑣碎吧~(再度嘆氣)
還是pass again 好了 XD 寫C++的人不懂寫C的難處啦!!!(見笑轉生氣)

bool isDigit(char *in)
{
if ((in >= 48 ) && (in <= 57))
return true;
return false;
}

char* decodeString(char* s) {
int len =strlen(s);
int *nums = calloc (30, sizeof(int));
char *items = calloc (8100, sizeof(char));
int n_idx=0, i_idx=0;
int num = 0;
for (int i=0; i<len;i++)
{
if (isDigit(s[i])) //push number
num = num*10 + (s[i]-'0');
else if (s[i]== '[') // pop number
{
nums[n_idx++] = num;
num = 0;
items[i_idx++] = s[i];
}
else if (s[i]== ']') // pop & insert to ret
{
char *tmp= calloc (i_idx+1, sizeof(char));
int len = 0;
while (i_idx>0 && items[i_idx-1]!= '[')
{
i_idx--;
tmp[len++] = items[i_idx];
items[i_idx] ='\0';
}
if (n_idx > 0)
i_idx--; //remove '['
int pop = nums[--n_idx];
for (int i=0; i<pop; i++)
for (int j=len-1;j>=0; j--)
items[i_idx++] = tmp[j];
}
else
items[i_idx++] = s[i];
}
return (i_idx==0) ? (s) : (items);
}


沒有留言:

張貼留言