思路:

例如把we are happy这个字符串中所有空格替换成"%20",最直接的做法是从头开始扫苗,遇到空格就替换,并且把空格后面的字符都顺序后移。复杂度O(n^2)。

重要思想(这个从后往前的思想特别重要,举一反三的例子也是):先扫描一遍字符串统计出空格数量blanknum,由于每个空格被替换成3个字符"%20",即每替换一个空格总长度增加2,因此最后总的长度应该是原长+blanknum*2。然后对字符串从后往前扫描,不是空格的直接移动到新位置,如果是空格替换成%20。

 #include <iostream>
#include <string>
#define maxlen 100
using namespace std; void ReplaceBlank(char strarr[], int length) //length是string总容量
{
int oldlength,newlength,blanknum;
if(strarr == NULL && length <= ) return; //先检查参数合法
int i=;
blanknum=;
oldlength = strlen(strarr)+;
/* while(strarr[i] != '\0')
{
// cout<<"b";
if(strarr[i] == ' ')
{
blanknum++;
i++;
}
}*/
for(int i=; i<oldlength; i++)
{
if(strarr[i] == ' ')
{
blanknum++;
}
}
newlength = oldlength + blanknum*;
if(newlength > length) return; //随时注意检查合法性
int indexOfOld = oldlength;
int indexOfNew = newlength;
while(indexOfOld >= )
{
if(strarr[indexOfOld] != ' ')
{
strarr[indexOfNew] = strarr[indexOfOld];
indexOfNew--;
indexOfOld--;
}
else
{
strarr[indexOfNew] = '';
strarr[--indexOfNew] = '';
strarr[--indexOfNew] = '%';
indexOfNew--;
indexOfOld--;
}
}
} int main()
{
char strarr[maxlen];
cout<<"Input a string:";
gets(strarr);
puts(strarr);
ReplaceBlank(strarr,maxlen);
puts(strarr);
return ;
}

代码里从13行开始的while循环很bug,一直死循环,看起来像是没有'\0',但是前一行已经用了strlen可以通过说明应该有'\0'啊。

举一反三:

有两个已排序数组A,B,A的末尾有足够的空间放A和B。现要求将B所有元素插入A中并仍是有序的,要求O(n)。

类似的:用两个index标记从后往前把大的移动到后面。

 #include <iostream>
#define maxn 100
using namespace std;
int arrA[maxn*],arrB[maxn]; void Merge(int alen, int blen)
{
int newlen = alen + blen;
int indexOfA = alen - ;
int indexOfB = blen - ;
int indexOfNew = newlen - ;
while(indexOfA >= && indexOfB >= )
{
if(arrA[indexOfA] > arrB[indexOfB])
{
arrA[indexOfNew] = arrA[indexOfA];
indexOfA--;
indexOfNew--;
}
else if(arrA[indexOfA] < arrB[indexOfB])
{
arrA[indexOfNew] = arrB[indexOfB];
indexOfB--;
indexOfNew--;
}
else
{
arrA[indexOfNew] = arrA[indexOfA];
indexOfA--;
indexOfNew--;
arrA[indexOfNew] = arrB[indexOfB];
indexOfB--;
indexOfNew--;
}
}
while(indexOfB >= )
arrA[indexOfNew--] = arrB[indexOfB--];
} int main()
{
int alen,blen;
cout<<"Input A B length:";
cin>>alen>>blen;
cout<<"Input arrA:";
for(int i=;i<alen;i++)
cin >> arrA[i];
cout<<"Input arrB:";
for(int i=;i<blen;i++)
cin>>arrB[i];
Merge(alen,blen);
cout<<"After Merge arrA:";
for(int i=; i<alen+blen; i++)
cout<<arrA[i]<<' ';
return ;
}

《剑指offer面试题4》替换空格——实现函数把字符串中每个空格替换成“%20”的更多相关文章

  1. 剑指offer——面试题30:包含min函数的栈

    #include"iostream" #include"stdio.h" using namespace std; ; ; template<typena ...

  2. 剑指Offer面试题15(Java版):链表中倒数第K个结点

    题目: 输入一个链表.输出该链表中倒数第k哥结点.  为了符合大多数人的习惯,本题从1開始计数.即链表的尾结点是倒数第1个结点. 比如一个链表有6个结点.从头结点開始它们的值依次是1.2.3,4,5, ...

  3. 剑指Offer面试题10(Java版):二进制中的1的个数

    题目:请实现一个函数,输入一个整数.输出该数二进制表示中1的个数. 比如把9表示成二进制是1001,有2位是1.因此假设输入9.该函数输出2. 1.可能引起死循环的解法 这是一道非常主要的考察二进制和 ...

  4. 剑指Offer面试题:19.包含Min函数的栈

    一.题目:包含Min函数的栈 题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数.在该栈中,调用min.push及pop的时间复杂度都是O(1). 这里我们要实现的就是min ...

  5. 【剑指offer 面试题21】包含min函数的栈

    思路: 通过增加一个辅助栈保存每个状态对应的最小值.栈实现的不完整,应该还包含empty()等常规函数. #include <iostream> #include <stack> ...

  6. C++版 - 剑指offer面试题38:数字在已排序数组中出现的次数

    数字在已排序数组中出现的次数 提交网址: http://www.nowcoder.com/practice/70610bf967994b22bb1c26f9ae901fa2?tpId=13&t ...

  7. 剑指Offer面试题51(Java版):数组中反复的数字

    题目:在一个长度为n的数组里的全部数字都在0到n-1的范围内. 数组中某些数字是反复的,但不知道有几个数字反复了.也不知道每一个数字反复的次数.请找出数组中随意一个反复的数字. 比如假设输入长度为7的 ...

  8. 剑指Offer面试题29(java版):数组中出现次数超过一半的数字

    题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 比如输入一个长度为9的数组{1,2,3,2.2,2.5,4,2}.因为数字2在数组中出现5次,超过数组长度的一半,因此输出2. 解 ...

  9. 【剑指Offer面试题】 九度OJ1510:替换空格

    c/c++ 中的字符串以"\0"作为结尾符.这样每一个字符串都有一个额外字符的开销. 以下代码将造成内存越界. char str[10]; strcpy(str, "01 ...

随机推荐

  1. MVC3-表单

    [.NET Core已取消]Html.BeginForm() 该方法用于构建一个From表单的开始,他的构造方法为:Html.BeginForm("ActionName", &qu ...

  2. SqlServer,Oracle,Mysql 获取指定行数

    --sqlserver * FROM dbo.T_TASK --oracle --mysql ,

  3. 通过串口工具下发指令的Python脚本

    前言 最近一段时间在测试物联网相关的App自动化,涉及通过串口工具给硬件设备下发指令. 使用的串口工具:SecureCRT 解决办法 通过引用Python的第三方库:serial,通过编写Python ...

  4. C++基本数据类型及类型转换

    http://blog.csdn.net/pipisorry/article/details/25346379 c++基本数据类型 什么样的数据算是byte类型,int类型,float类型,doubl ...

  5. 3932: [CQOI2015]任务查询系统

    3932: [CQOI2015]任务查询系统 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 2559  Solved: 819[Submit][Sta ...

  6. Hadoop实战-MapReduce之倒排索引(八)

    倒排索引 (就是key和Value对调的显示结果) 一.需求:下面是用户播放音乐记录,统计歌曲被哪些用户播放过 tom        LittleApple jack       YesterdayO ...

  7. Axure实现Tab选项卡切换功能

    这几天用Axure画原型图的过程中,须要实现Tab选项卡切换的效果,但Axure中并没有类似于Tab控件的部件,所以能够用Axure中的动态面板(Dynamic Panel)来实现. 本文以已经汉化的 ...

  8. windows下使用DOS命令删除大文件

    首先进入DOS命令窗口: 1.进入到将要删除的目录: 执行命令: rmdir /s/q 文件夹名称 2.删除指定文件: 进入文件的目录下,找到要删除的文件名称+扩展名:例如111.jpg执行命令: d ...

  9. CentOS 更换 usr 挂载分区

    由于之前挂载在/usr目录的分区空间过小,无法安装更多需要的软件,现在添加一块硬盘重新挂载在/usr目录,并将之前/usr 目录下的内容(包括权限.连接等)完整拷贝到新磁盘分区的/usr目录. 操作系 ...

  10. Uninstall Tool3.5.3

    2.卸载所有和MySQL相关的程序,有好几个,注意,一定要删除与MySQL相关的所有的数据,不能用MySQL自带的卸载,我是用Uninstall Tool3.5.3,在卸载程序界面,右键选择与MySQ ...