【剑指offer】面试题4替换空格
来源:互联网 发布:ubuntu wifi 热点 编辑:程序博客网 时间:2024/05/16 07:58
题目:替换字符串中的空格为“%20”。
说明:在浏览器的地址栏中输入某个网址,在解析过程中会看到类似“%20”的字样,这应该就是网络编程涉及的内容。。。
这个题目非常简单,只是通过一步遍历,然后将一个字符串数组赋给另外一个数组的过程中,遇到空格,插入‘%20’即可。
但是:考虑问题还是不全面,我们应该问清楚是在原数组的基础上插入,还是创建一个新的数组然后再赋值。不能太想当然了,我的解题思路是按照创建一个新的数组,为了避免过度浪费,就用动态创建。当不够用的时候再分配一倍的数组空间。这时利用multi变量来表示倍数。
代码如下:
#include <stdio.h>#include <stdlib.h>char *replace_space(char arr[],int length);int main(void){ char buf[] = "a ! "; printf("size of buf :%d,%d\n",sizeof(buf)/sizeof(char),sizeof(char)); char *tempbuf = replace_space(buf,sizeof(buf)/sizeof(char)); printf("%s",tempbuf); return 0;}char *replace_space(char arr[],int length){ int multi = 2; // int length = sizeof(arr)/sizeof(char); //这一行代码是不正确的,sizeof(arr)只是指针占据的空间,不是数组 char *temparr = (char *)malloc(multi*length *sizeof(char)); char *buf = temparr; while(*arr){ if((buf-temparr)+3 > multi * length){ //动态分配新的数组大小 int len = buf - temparr; temparr = (char *)realloc(temparr,(++multi) * length * sizeof(char)); buf = temparr + len; //不仅数组起始指针要保留,遍历过程的指针也要保留 } if(*arr == ' '){ *buf++ = '%'; *buf++ = '2'; *buf++ = '0'; arr++; } else *buf++ = *arr++; } *buf = '\0'; //必须加上,以对字符串设置结束标志! return temparr;}
说明:
(1)关于用指针和数组的差别,剑指offer举出了这样一个例子:
int get_size(int data[]){ return sizeof(data);}int main(void){ int data1[] = {1,2,3,4,5}; int size1 = sizeof(data1); int *data2 = data1; int size2 = sizeof(data2); int size3 = get_size(data1); printf("%d %d %d",size1,size2,size3);}
输出结果为“20,4,4”。求data2的时候容易看出,这里的data2只是一个指针,因此sizeof()后只是一个指针占的空间大小。在32位系统上,对任意的指针进行sizeof均为四个字节。但是将数组传递给函数时,其实传递的也是指针!对其进行求取,也是4。
(2)通过跟作者的代码比较,体现了自己的很多不足:
使用变量名时,尽量使用有意义的名字;无论指针还是数组名,由于都是地址,在使用之前一定要判空(为了维护代码的健壮性)。
作者代码:
void replaceBlank(char string[],int length){ if(string == NULL && length <=0) return; /*originalLength为字符串string的实际长度*/ int originalLength = 0; //统计字符串总数,以及空格的总数 int numberOfBlank = 0; int i = 0; while(string[i]!='\n'){ //能否简化为string[i]? ++originalLength; if(string[i] == ' ') ++numberOfBlank; ++i; } //计算所需的总长度,并判断是否能容下,不能的话就退出程序 int newLength = originalLength + numberOfBlank * 2; if(newLength > length) return; int indexOfOriginal = originalLength; int indexOfNew = newLength; while(indexOfOriginal >=0 && indexOfNew > indexOfOriginal){ //当字符串赋值完毕或者最后一个空格转换完成后,指针重合时结束 if(string[indexOfOriginal] == ' '){ string[indexOfNew--] = '0'; string[indexOfNew--] = '2'; string[indexOfNew--] = '%'; }else string[indexOfNew--] = string[indexOfOriginal]; --indexOfOriginal; }}
评注:作者代码考虑的全面,考虑了程序的健壮性,并且当要插入数据的时候,可以从数组后向前遍历进行复制,技巧很好。
0 0
- 剑指offer-->面试题4 替换空格
- 《剑指offer》面试题4 替换空格
- 【剑指offer】面试题4:替换空格
- 【剑指offer】面试题4替换空格
- 剑指offer 面试题4 替换空格
- 剑指Offer:面试题4 替换空格
- 剑指offer-面试题4-替换空格
- 《剑指Offer》面试题4:替换空格
- 【剑指offer】 面试题4: 替换空格
- 剑指offer 面试题4---替换空格
- 剑指offer面试题4-- 替换空格
- 【剑指offer】面试题4:替换空格
- 剑指Offer:面试题4 替换空格
- 剑指offer-面试题4:替换空格
- 剑指Offer 面试题4 替换空格
- 剑指offer-----面试题4(替换空格)
- 剑指offer面试题4 替换空格
- 剑指offer面试题4:替换空格
- LC_CTYPE: cannot change locale (UTF-8) error
- Ubuntu 使用VI
- 程序员求职面试心经40条——谨记原则
- IOS 模糊掉图片指定区域
- 算法实验二:实习和工作
- 【剑指offer】面试题4替换空格
- cocos3.1.1+vs2012+cocosstudio
- 移动云服务平台 推送工具 OpenMobster
- idea+tomcat+tomcat运行项目(一)
- 16 oj 对象数组求最大值
- 单例模式
- 雾山的Robotium学习笔记---使用junitreport导出测试报告
- 移动互联网3.0时代【逆向付费】---微乐
- 设计模式—原型模式