《剑指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 ...
随机推荐
- React系列-ES6
ES6新特性概览 React系列代码(非本人) 5 Projects to Help You Learn React 本人对javascript并不擅长,只是在工作中会时常用到,而且以jQuery居多 ...
- 从头认识java-15.1 填充容器(2)-利用Collection的addAll方式
接着上一章节,我们继续介绍填充容器. 这一章节我们结束还有一种填充容器的方式:addAll 样例: package com.ray.ch15; import java.util.ArrayList; ...
- HDU 1247 Hat’s Words(字典树变形)
题目链接:pid=1247" target="_blank">http://acm.hdu.edu.cn/showproblem.php? pid=1247 Pro ...
- Hibernate中的Sesson操作
一.Session概述 Session是应用程序与数据库之间的一个会话,是Hibernate运作的中心,持久层操作的基础,相当于JDBC中的Connection.Session对象是通过Session ...
- CMD命令操作
win + R 然后输入 cmd 打开命令窗口 或者开始-->运行 打开 1.进入 D盘 输 d: 回车2.进入D盘 子目录 输入 cd d:\test 回车 3. dir 回车 进入文件目录 ...
- 在图片上加字符-base64转图片-图片转base64
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- iOS 设备获取唯一标识符汇总
在2013年3月21日苹果已经通知开发者,从2013年5月1日起,访问UIDID的应用将不再能通过审核,替代的方案是开发者应该使用“在iOS 6中介绍的Vendor或Advertising标示符”. ...
- 1022. Fib数列
https://acm.sjtu.edu.cn/OnlineJudge/problem/1022 Description 定义Fib数列:1,1,2,3,5,8,13,…1,1,2,3,5,8,13, ...
- 升级python到最新2.7.13
python2.7是2.X的最后一个版本,同时也加入了一部分3.X的新特性.并且具有更好的性能,修改多个bug.所以决定升级到最新的2.7版,我的目前的版本是2.6.6 查看当前python版本 # ...
- atol实现【转】
int my_atoi(const char *str) { assert(str != NULL); ; ; while(*str == ' ' || *str == '\n' || *str == ...