【问题标题】:Minimum value string最小值字符串
【发布时间】:2015-10-03 21:51:58
【问题描述】:

给定数字字符串,如“72388”和 int n,从字符串中删除 n 个字符,这样生成的字符串包含最小数字表示,您必须保留数字的相对位置。示例:如果 st="72388" 且 n=2,则答案为 238。

以下解决方案似乎不适用于所有情况。我们怎样才能将一个字符串减少到最小的字符串?

解决方案: 这里的想法是从左到右扫描删除一个字符,如果它大于字符串数组中的下一个字符和上一个字符。如果在迭代结束时删除的字符数小于“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;
}
}

【问题讨论】:

  • 您是否有一个在线性时间内运行的算法?
  • 我实现的算法似乎不适用于特定情况。所以我不知道任何算法在所有情况下都能正常运行
  • 你为什么不发布你目前的方法?
  • 能否请您重新表述您的问题。我无法理解您在这里使用的逻辑是什么。

标签: c arrays string algorithm


【解决方案1】:

我会给出一些提示,以免破坏乐趣:

删除的顺序不影响结果。因此,您可以逐个删除数字,每次删除使数字尽可能小的数字。

要删除的数字将是最左边大于其后继的数字。

如果没有这个数字,则数字顺序递增,要删除的数字是最后一位。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-02
    • 1970-01-01
    • 1970-01-01
    • 2022-09-27
    • 2017-07-29
    相关资源
    最近更新 更多