《剑指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 ...
随机推荐
- Learning English From Android Source Code:2 Ampersand
这一次想把标点符号的英语表达总结一下,这些单词非常重要但easy被我们忽视.以我的经验,还是多认识几个.以备不时之需. 以下从"标点符号"開始: punctuation [英][ˌ ...
- 无线(仅WIFI)攻击思路总结
从事信息安全相关工作5年了,虽然主要工作是安全产品售前.安全服务等方向,但既然选择了安全,想必都是有点黑客情节的,因此也前前后后杂七杂八的学了点东西.最近在研究无线(主要是WIFI)安全,相关书籍看了 ...
- 简述C++中的多态机制
前言 封装性,继承性,多态性是面向对象语言的三大特性.其中封装,继承好理解,而多态的概念让许多初学者感到困惑.本文将讲述C++中多态的概念以及多态的实现机制. 什么是多态? 多态就是多种形态,就是许多 ...
- Andorid——ubuntu下的 NDK / JNI
之前一直有接触源代码里面的JNI体系,知道个大概,仅仅管调进了哪个C/C++的接口,如今记录学习下. 撰写不易,转载请注明出处:http://blog.csdn.net/jscese/article/ ...
- MySQL 存储过程 (3)
以下介绍下像数据库循环插入数据操作 第一步:建立存储过程用到的信息表
- 开源服务器监控工具 — JavaMelody 类 jvm 内在性能(转)
开源服务器监控工具 — JavaMelody JavaMelody它能够监测Java或Java EE应用程序服务器,并以图表的方式显示:Java内存和Java CPU使用情况,用户Sessio ...
- 九度OJ 1121:首字母大写 (字符串处理)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2865 解决:1007 题目描述: 对一个字符串中的所有单词,如果单词的首字母不是大写字母,则把单词的首字母变成大写字母. 在字符串中,单词 ...
- python中的类的成员变量以及property函数
1 python类的各种变量 1.1 全局变量 在类外定义的变量. 1.2 类变量 定义在类里面,所有的函数外面的变量.这个变量只有一份,是所有的对象共有的.在类外用“类.”来引用. 1.3 实例变量 ...
- javascript --- 声明提前(学习笔记)
声明提升 未声明变量 console.log(a); 在没有定义 a 的情况下,直接使用,会报错. 声明变量 console.log(a); var a = 2; 输出结果:undefined 并不会 ...
- opencv配置指南
今天配置了一把opencv,在vs2013,Python.IDEA(Java)上分别作了配置.总结成文档,分享给大家. 搭建opencv+vs2013的环境 安装opencv3.0 alpha 和 v ...