给出一个像
这样的URL格式的字符数组 char *s="www.google.com\tsp finite.aspx"
解码时,空格应该被%20替换,因此字符串变为:
char *s="www.google.com\tsp%20finite.aspx"
我们不允许使用新的字符数组,但允许使用某些字符变量进行临时使用。不应该使用任何容器。该数组包含足够的空间来包含解码数据,因此无需担心需要占用更多空间。
我遵循Brute-Force机制,其中从寻找空间到数组末尾的所有字符都要交换。但这不是解决问题的最有效方法。
任何人都可以告诉我减少号码的最佳方式(算法)。为了获得解决方案而进行的交换。
答案 0 :(得分:2)
我假设字符串已使用malloc
首先计算空格数和字符串长度
然后新长度=旧长度+空格数* 2.使用realloc展开字符串。
从最后向后工作并复制到新长度。在%20中遇到空间复制时。
答案 1 :(得分:1)
主要问题可能是用%20交换空格需要将整个字符串移动2个字符以上。
这是一个想法:
这样,每次进入空间时都会避免向前移动弦。
关于步骤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)
伪代码:
newSize=oldSize+2
您也可以在原始字符串上执行该操作,但该解决方案有点复杂,因为您必须移动所有内容。