替换空格
来源:互联网 发布:北美海关数据 编辑:程序博客网 时间:2024/06/09 18:22
请实现一个函数,把字符串中的每个空格替换成”%20”。例如输入“We are happy.”, 则输出”We%20are%20happy.”。
在网络编程中,如果URL参数中含有特殊字符,如空格、’#’等,可能导致服务器端无法获得正确的参数值。我们需要将这些特殊符号转换成服务器可以识别的字符。转换的规则是在’%’后面跟上ASCII码的两位十六进制的表示。比如空格的ASCII码是32,即十六进制的0x20,因此空格被替换成”%20”。再比如’#’的ASCII码为35,即十六进制的0x23,它在URL中被替换为”%23”。
思路一:从左向右扫描字符串替换
一个字符替换为三个
每遇到一个空格,空格后面所有字符向右移动两个位置
字符串长度为n, 对每个空格而言,需要移动后面O(n)个字符
算法的时间复杂度为O(n^2)
思路二:从右到左扫描字符串替换
统计空格数,字符串长度增加 空格数 * 2
维持两个指针p1, p2
p1指向原字符串长度末尾, p2指向新字符串长度末尾
当p1遇到空格时, p2 向前移动并替换字符为 ‘0’ ‘2’ ‘%’
把p1指针指向的字符拷贝到p2指针指向的字符
所有字符都只移动一次,时间复杂度为O(n)
下面的C实现是思路二的实现代码:
//// main.c// func//// Created by 52coder on 2017/12/18.// Copyright © 2017年 52coder. All rights reserved.//#include <stdio.h>#include <string.h>void trimspace(char str[],int len){ int i = 0; //空格个数 int space = 0; //替换前字符串长度 int real = 0; //新长度 int newlen = 0; while(str[i] != '\0') { real += 1; if(' ' == str[i]) { space += 1; } i++; } //计算实际长度,每个空格多出两个长度 newlen = real + space * 2; if(newlen > len) { printf("Not enough space.newlen = %d,len = %d\n",newlen,len); return ; } int src = real; int dst = newlen; while(src >=0) { if (' ' == str[src]) { str[dst--]='0'; str[dst--]='2'; str[dst--]='%'; } else { str[dst--] = str[src]; } --src; }}int main(int argc, const char * argv[]){ //测试用例 char str[100] = "We are happy."; trimspace(str,sizeof(str)); printf("%s\n",str); //测试用例 char s[100] = "We are happy ,are you ojbk?"; trimspace(s,sizeof(s)); printf("%s\n",s); //测试用例 char a[100] = "We are happy ,are you ojbk ? "; trimspace(a,sizeof(a)); printf("%s\n",a); //测试用例 char b[16] = "We are happy."; trimspace(b,sizeof(b)); printf("%s\n",b); return 0;}
阅读全文