给定字符串,如“72388”和int n,从sting中删除n个字符,使得结果字符串包含最小数字表示,您必须保留数字的相对位置 . 示例:如果st =“72388”且n = 2,则答案为238 .
以下解决方案似乎并不适用于所有情况 . 我们如何将字符串减少到最小字符串?
解决方案:这里的想法是从左到右扫描如果它大于字符串数组中的下一个字符和prev字符,则删除一个字符 . 如果在迭代结束时删除的字符数小于'n',则重复从字符串的结尾到开始的相同迭代 .
char *
min_string(char *str, int n)
{
static char buf[100] = "";
int len = strlen(str);
int k = -1;
int count = 0;
int i;
char prev, curr, next;
if(len == 0 || len < n)
return -1;
if(len == n)
return 0;
prev = str[0];
for(i=1; i<len-1 && count<=n; i++)
{
curr = str[i];
next = str[i+1];
if(curr > next && curr > prev)
{
count++;
continue;
}
else if(curr < next && curr <= prev)
{
count++;
prev = curr;
buf[k] = curr;
}
else
{
buf[++k] = curr;
}
}
if(count < n)
{
count = 0;
k = len - n;
prev = buf[k - 1] = str[len-1];
for(i=len-2; i>0; i--)
{
curr = str[i];
next = str[i-1];
if(curr > next && curr > prev)
{
count++;
continue;
}
else if(curr < next && curr <= prev)
{
count++;
prev = curr;
buf[k] = curr;
}
else
{
buf[--k] = curr;
}
}
printf("Resulted string : %s\n", buf);
return buf;
}
else
{
for(; i<len; i++)
{
buf[++k] = str[i];
}
printf("Resulted string ascending : %s\n", buf);
return buf;
}
}
1 回答
我会给一些暗示不破坏乐趣:
删除顺序不会影响结果 . 因此,您可以逐个删除数字,每次删除使数字尽可能小的数字 .
要删除的数字将是最左边的数字,大于其后继数字 .
如果没有这样的数字,则数字增加序列,要删除的数字是最后一个 .