《剑指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 ...
随机推荐
- 更新 手淘 flexible 布局 rem 单位适配问题
详见链接 https://github.com/amfe/lib-flexible
- etymology-I
1)inter-.intra-.intro- 三个前缀inter-,intra-和intro-还是有差别的. inter-表between,如international那是between differ ...
- javascript JSON.parse和eval的区别
SON.parse()用来将标准json字符串转换成js对象:eval()除了可以将json字符串(非标准的也可以,没有JSON.parse()要求严格)转换成js对象外还能用来动态执行js代码.例如 ...
- [SCOI2009] 最长距离
题目描述 windy有一块矩形土地,被分为 NM 块 11 的小格子. 有的格子含有障碍物. 如果从格子A可以走到格子B,那么两个格子的距离就为两个格子中心的欧几里德距离. 如果从格子A不可以走到格子 ...
- 给js设定一个统一的入口
javascript是种脚本语言,浏览器下载到哪儿就会运行到哪儿,这样的特性会为编程提供方便,但也easy使程序过于凌乱.支离破碎. js从功能上能够分为两大部分--框架部分和应用部分,框架部分提供的 ...
- 大数据之ES系列——第一篇 ElasticSearch2.2 集群安装部署
第一部分 安装准备 准备三台主机节点: hc11.spads 192.168.160.181 hc12.spads 192.168.160.182 hc13.spads 192.168.160 ...
- Linux下配置Objective-C编译环境
Ubuntu环境下Objective-C编译环境配置参考这里. CentOS环境下Objective-C编译环境配置参考这里. 还在继续探索中.
- linux下环境搭建
1.jdk https://ivan-site.com/2012/05/download-oracle-java-jre-jdk-using-a-script/ 在linux用wget直接下载JDK ...
- Windows Server 2012 修改桌面图标
在virtualbox 4.2.18中装了个Windows Server 2012 来体验下,结果发现桌面图标都不知道在哪改.在百度文库上找到了解决方法:http://wenku.baidu.com/ ...
- cannot find -lbz2 解决方法
sudo yum install -y bzip2* 或者sudo apt-get install bzip2* 还是报错就找到libbz2.so.1,建立连接或者复制到 /usr/lib/libbz ...