《剑指offer面试题4》替换空格——实现函数把字符串中每个空格替换成“%20”
思路:
例如把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”的更多相关文章
- 剑指offer——面试题30:包含min函数的栈
#include"iostream" #include"stdio.h" using namespace std; ; ; template<typena ...
- 剑指Offer面试题15(Java版):链表中倒数第K个结点
题目: 输入一个链表.输出该链表中倒数第k哥结点. 为了符合大多数人的习惯,本题从1開始计数.即链表的尾结点是倒数第1个结点. 比如一个链表有6个结点.从头结点開始它们的值依次是1.2.3,4,5, ...
- 剑指Offer面试题10(Java版):二进制中的1的个数
题目:请实现一个函数,输入一个整数.输出该数二进制表示中1的个数. 比如把9表示成二进制是1001,有2位是1.因此假设输入9.该函数输出2. 1.可能引起死循环的解法 这是一道非常主要的考察二进制和 ...
- 剑指Offer面试题:19.包含Min函数的栈
一.题目:包含Min函数的栈 题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数.在该栈中,调用min.push及pop的时间复杂度都是O(1). 这里我们要实现的就是min ...
- 【剑指offer 面试题21】包含min函数的栈
思路: 通过增加一个辅助栈保存每个状态对应的最小值.栈实现的不完整,应该还包含empty()等常规函数. #include <iostream> #include <stack> ...
- C++版 - 剑指offer面试题38:数字在已排序数组中出现的次数
数字在已排序数组中出现的次数 提交网址: http://www.nowcoder.com/practice/70610bf967994b22bb1c26f9ae901fa2?tpId=13&t ...
- 剑指Offer面试题51(Java版):数组中反复的数字
题目:在一个长度为n的数组里的全部数字都在0到n-1的范围内. 数组中某些数字是反复的,但不知道有几个数字反复了.也不知道每一个数字反复的次数.请找出数组中随意一个反复的数字. 比如假设输入长度为7的 ...
- 剑指Offer面试题29(java版):数组中出现次数超过一半的数字
题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 比如输入一个长度为9的数组{1,2,3,2.2,2.5,4,2}.因为数字2在数组中出现5次,超过数组长度的一半,因此输出2. 解 ...
- 【剑指Offer面试题】 九度OJ1510:替换空格
c/c++ 中的字符串以"\0"作为结尾符.这样每一个字符串都有一个额外字符的开销. 以下代码将造成内存越界. char str[10]; strcpy(str, "01 ...
随机推荐
- 将Ubuntu主文件夹里的中文文件夹名称改成英文
方法一: 首先修改现有主文件夹下各文件夹名称: Desktop. Documents. Download. Music. Pictures. Public. Templates. Videos …… ...
- php返回HTTP状态码
HTTP协议状态码,调用函数时候只需要将$num赋予一个下表中的已知值就直接会返回状态了.<?PHP /** * HTTP Protocol defined status codes* HTTP ...
- 当CSDN携手Markdown
当CSDN携手Markdown Tags: CSDN Markdown 当CSDN携手Markdown Markdown CSDN-Markdown 也不知道是不是基于 Github 崛起的因素,Ma ...
- RestTemplate请求
JSONObject json = new JSONObject(sendParam);HttpHeaders headers = new HttpHeaders();MediaType type = ...
- Cisco策略路由(policy route)精解(转载)
原文:http://www.guanwei.org/post/Cisconetwork/07/Cisco-policy-route_8621.html 注:PBR以前是CISCO用来丢弃报文的一个主要 ...
- Erlang Shell调试网络程序真方便
Erlang的shell功能强大,这里我将它当成我的客户端.可以动态的输入你需要发送的内容,也可以动态的接收内容,就像调试器一样,在开发过程中起到很重要的作用.具体使用方式如下: C:\Documen ...
- vmware虚拟机centos网络配置错误,执行/etc/init.d/network start 或 restart 提示Device eth0 has different MAC address than expected, ignoring
vmware虚拟机centos网络配置错误,执行/etc/init.d/network start 或 restart 提示Device eth0 has different MAC address ...
- How to deploy a Delphi OSX project from the command line
Delphi has a well developed command line build process (via MSBuild) for Windows projects. After the ...
- 发布镶嵌数据集,服务端Raster Function制作
1.新建GDB 2.GDB里右键,New 镶嵌数据集. 3.向镶嵌数据集中添加风速TIF. 4.利用原样式,导出一个函数模板. 导出是XML. 5.发布ImageService服务时,在Functio ...
- Android记录程序崩溃Log写入文件
将导致程序崩溃的堆栈调用Log写入文件,便于收集bug.在调试安卓程序,由于某些原因调试时手机不能连接PC端,无法通过IDE查看程序崩溃的Log,希望log能够写入文件中,对于已经发布的App可以通过 ...