解码字符数组

时间:2015-02-02 11:51:22

标签: c++ c arrays algorithm

给出一个像

这样的URL格式的字符数组
   char *s="www.google.com\tsp finite.aspx"

解码时,空格应该被%20替换,因此字符串变为:

   char *s="www.google.com\tsp%20finite.aspx"

我们不允许使用新的字符数组,但允许使用某些字符变量进行临时使用。不应该使用任何容器。该数组包含足够的空间来包含解码数据,因此无需担心需要占用更多空间。

我遵循Brute-Force机制,其中从寻找空间到数组末尾的所有字符都要交换。但这不是解决问题的最有效方法。

任何人都可以告诉我减少号码的最佳方式(算法)。为了获得解决方案而进行的交换。

4 个答案:

答案 0 :(得分:2)

我假设字符串已使用malloc

分配

首先计算空格数和字符串长度

然后新长度=旧长度+空格数* 2.使用realloc展开字符串。

从最后向后工作并复制到新长度。在%20中遇到空间复制时。

答案 1 :(得分:1)

主要问题可能是用%20交换空格需要将整个字符串移动2个字符以上。

这是一个想法:

  1. 解析整个字符串一次,并计算字符串
  2. 中的空格数
  3. 数组的新长度是strlen(原始)+ 2 *(nOfSpaces)(让我们从现在开始在NewLen上调用它)
  4. 再次解析整个字符串,但是向后开始。
  5. 您将复制先前的字符串内容,但是在偏移处直到您触及空格
    • 你将有一个以strlen(原始)开头的指针和一个从NewLen
    • 开始的指针
    • 从strlen(原始)向后解析,直到找到一个空格(substrLen将为subLen)
    • 来自[strlen(original)-curParsingindex]的memcpy到[NewLen - curParsingIndex-2 *(enteredSpaces)]转租金额
  6. 而不是复制空格,而是将%20改为
  7. 这样,每次进入空间时都会避免向前移动弦。

    关于步骤4,你可能会考虑为sublen使用一个临时变量,因为你可能会错误地写入同一个内存区域(举例说明所有空格都在开头)。

答案 2 :(得分:0)

你可以两次通过。关键的想法是先计算空格数,然后将每个字符直接移动到最终位置。在你的方法中,你会在每次出现空格时移动字符串的其余部分。

#include <stdio.h>

int main ()
{
    char str[1000] = "www.example.com/hello world !";
    int length;
    int spaces;
    int i;
    char *ptr;

    printf ("\"%s\"\n", str);

    // pass 1:
    // calculate length and count spaces
    length = 0;
    spaces = 0;
    for (ptr = str; *ptr; ptr++) {
        if (*ptr == ' ') {
            spaces++;
        }
        length++;
    }

    // pass 2:
    // transform string
    // preserve terminating null character
    ptr = str + length + 2 * spaces;
    for (i = length; i >= 0; i--) {
        char c = str[i];

        if (c == ' ') {
            *ptr-- = '0';
            *ptr-- = '2';
            *ptr-- = '%';
        }
        else {
            *ptr-- = c;
        }
    }

    printf ("\"%s\"\n", str);

    return 0;
}

答案 3 :(得分:0)

这是一个经典的访谈编码问题;一个很好的解决方案就是为您的解决方案提供良好的界面。有效的方法是:

char* replaceChar(char* in, char c)

char *in - string you want to decode
c - the char you want to replace with it's hexa value ASCII code ( HEX val ascii for ' ' is 0x20)

伪代码:

  1. 分配与输入缓冲区大小相同的缓冲区
  2. 获取要替换的第一个char出现的索引(strcspn可以帮助解决)
  3. 将输入的内容复制到找到的索引到新缓冲区。
  4. 将新缓冲区大小重新分配到newSize=oldSize+2
  5. 将%添加到新字符串
  6. 重复,直至到达字符串的末尾。
  7. 返回指向新字符串的指针
  8. 您也可以在原始字符串上执行该操作,但该解决方案有点复杂,因为您必须移动所有内容。