也是同一天的面试题。
给定一个数组"aa bb cee ee a",使用int SawpWords(char *str)排序之后str的新顺序为"a aa bb cee ee";同时题中重点说明了防止内存泄漏问题。
也是没有完全写好,真的是手写代码难呀,还是基础不满分。
回来之后认真研究了一下,把最终代码写出来了。
void AddNewElementToList(list<char*> &lchr, char *ch)
{
for (auto itor = lchr.begin(); itor != lchr.end(); ++itor)
{
if (strcmp(ch, *itor) < 0)
{
lchr.insert(itor, ch);
return;
}
}
lchr.push_back(ch);
return;
}
int SwapWords(char *str)
{
if (str == NULL)
return -1;
list<char*> lchr;
int len = strlen(str) + 1;
char *buff = new char[len];
if (buff == NULL) return -1;
memset(buff, 0, len);
char *temp = str;
int index = 0;
while (*temp != '\0')
{
if (*temp == ' ')
{
if (strlen(buff) == 0)
{
++temp;
index = 0;
memset(buff, 0, len);
continue;
}
char *newbuff = new char[strlen(buff) + 1];
memset(newbuff, 0, strlen(buff) + 1);
strcpy(newbuff, buff);
AddNewElementToList(lchr, newbuff);
memset(buff, 0, len);
index = 0;
}
else
{
buff[index++] = *temp;
}
++temp;
}
if (index != 0)
{
char *newbuff = new char[strlen(buff) + 1];
memset(newbuff, 0, strlen(buff) + 1);
strcpy(newbuff, buff);
AddNewElementToList(lchr, newbuff);
memset(buff, 0, len);
index = 0;
}
delete[] buff;
buff = NULL;
memset(str, 0, strlen(str));
temp = str;
for (auto itor = lchr.begin(); itor != lchr.end(); ++itor)
{
for (int i = 0; i < strlen(*itor); ++i)
{
temp[index++] = (*itor)[i];
}
auto tempitor = itor;
tempitor++;
if (tempitor != lchr.end())
{
temp[index++] = ' ';
}
}
return 0;
}
void main()
{
int len = 15;
char *ch = new char[len];
memset(ch, 0, len);
strcpy(ch, " aa bb cee ee a ");
int iret = SwapWords(ch);
printf("iret=%d,(ch=%s)\n", iret, ch);
return;
}