题目:替换字符串中的空格为“%20”。

说明:在浏览器的地址栏中输入某个网址,在解析过程中会看到类似“%20”的字样,这应该就是网络编程涉及的内容。。。

   该题总体来说比较简单(连我都能想到!),个人认为考查的是思维的敏捷。

1、先按照自己的思路编程如下:

//以下为开辟新的存储单元,并在新的存储上执行替换O(n)
#include "stdafx.h"
#include <iostream> using namespace std; /*int main(int argc, char* argv[])
{
char String[] = "We are happy.";
char* str = String;
char result0[30]; // char result0[] = "\0"; (会导致程序崩溃!)
// 预先开辟结果的存储空间
char* result = result0;
char* SubtituteString = "%20";
char* Subtemp = SubtituteString;
while(*str != '\0')
{
if(' ' == *str)
{
while(*SubtituteString != '\0')
{
*result = *SubtituteString;
SubtituteString++;
result++;
}
str++;
SubtituteString = Subtemp;
}
else
{
*result = *str;
result++;
str++;
} }
*result = '\0';
cout<<result0<<endl;
return 0;
}*/ //以下为本地替换O(n) int main(int argc, char* argv[])
{
char String[] = "We are happy.";
int len = strlen(String);
int i = , num = ; //找空格总数O(n)
while(i < len)
if(String[i++] == ' ')
num++;
//最终字符串所占空间
int totallen = len+*num;
String[totallen] = '\0';
//由后向前移动字符
while(len) //O(n)
{
if(String[len-] != ' ')
String[--totallen] = String[--len]; //一步到位
else
{ String[--totallen] = '';
String[--totallen] = '';
String[--totallen] = '%';
--len;
} } //减少移动次数
cout<<String<<endl;
return ;
}

经过自己分析,无论本地替换还是开辟新的存储单元替换,时间复杂度都可以达到O(n).

看过作者的代码,自己写的代码无论从可读性、还是健壮性来说都存在差距!

1、变量命名上,尽量一眼看穿用途

2、无论指针还是数组名,因为都是地址,所以使用之前判空

3、当替换最后一个空格之后,两个指针会重合,此作为循环结束条件之一。

重写作者代码以加深印象:

//length为string字符数组的总容量

void ReplaceBlanks(char string[], int length)
{
if(string == NULL || length <=)
return;
//originalLength为string[]的实际长度
int originalLength = ;
int numberOfblanks = ;
int i = ;
while(string[i] != '\0')
{
++originalLength;
if(string[i] == ' ')
++numberOfblanks;
++i;
}
//newLength为空格替换为"%20"后,字符串实际长度
int newLength = originalLength + * numberOfblanks;
//判断newLength是否过界
if(newLength > length)
return;
int indexOfOriginal = originalLength;
int indexOfnew = newLength;
while(indexOfOriginal >= && indexOfnew > indexOfOriginal)
{
if(string[indexOfOriginal] == ' ')
{
string[indexOfnew--] = '';
string[indexOfnew--] = '';
string[indexOfnew--] = '%';
}
else
string[indexOfnew--] = string[indexOfOriginal];
indexOfOriginal--; }
}

相关题目:有序数组A1,A2,且A1空间充足,要求:将A1,A2合并到A1且最终结果有序。

int main()
{
int Array1[] = {,,,,};
int Array2[] = {,,,,};
MergeSortedArray(Array1,Array2,,);
return ;
} void MergeSortedArray(int Array1[], int Array2[], int size1,int size2)
{
//数组由小到大排列
//指针、大小判空
if(Array1 == NULL || Array2 == NULL || size1 == || size2 == )
return;
//
int TotalLength = size1+size2;
int OutputLength = TotalLength;
TotalLength--;
int IndexOfArray1 = size1-;
int IndexOfArray2 = size2-;
while(IndexOfArray1>= && IndexOfArray2>=)
{
if(Array1[IndexOfArray1] > Array2[IndexOfArray2])
{
Array1[TotalLength--] = Array1[IndexOfArray1];
IndexOfArray1--;
}
else
{
Array1[TotalLength--] = Array2[IndexOfArray2];
IndexOfArray2--;
}
}
//得到剩余数字的索引,分类讨论
if(IndexOfArray1 > IndexOfArray2)
while(IndexOfArray1 >= && TotalLength >=)
{
Array1[TotalLength--] = Array1[IndexOfArray1];
IndexOfArray1--;
}
else
while(IndexOfArray2 >= &&TotalLength >=)
{
Array1[TotalLength--] = Array2[IndexOfArray2];
IndexOfArray2--;
}
//输出排序后整个数组
for(int i=; i<OutputLength; i++)
cout<<Array1[i]<<',';
cout<<endl;
}

PS:程序仍有不少瑕疵。。。,自己可提升的空间太大了!!!

剑指offer--面试题4的更多相关文章

  1. 剑指Offer:面试题15——链表中倒数第k个结点(java实现)

    问题描述 输入一个链表,输出该链表中倒数第k个结点.(尾结点是倒数第一个) 结点定义如下: public class ListNode { int val; ListNode next = null; ...

  2. 剑指offer面试题3 二维数组中的查找(c)

    剑指offer面试题三:

  3. 剑指Offer——笔试题+知识点总结

    剑指Offer--笔试题+知识点总结 情景回顾 时间:2016.9.23 12:00-14:00 19:00-21:00 地点:山东省网络环境智能计算技术重点实验室 事件:笔试 注意事项:要有大局观, ...

  4. C++版 - 剑指offer之面试题37:两个链表的第一个公共结点[LeetCode 160] 解题报告

    剑指offer之面试题37 两个链表的第一个公共结点 提交网址: http://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46?t ...

  5. C++版 - 剑指offer 面试题23:从上往下打印二叉树(二叉树的层次遍历BFS) 题解

    剑指offer  面试题23:从上往下打印二叉树 参与人数:4853  时间限制:1秒  空间限制:32768K 提交网址: http://www.nowcoder.com/practice/7fe2 ...

  6. C++版 - 剑指offer 面试题39:判断平衡二叉树(LeetCode 110. Balanced Binary Tree) 题解

    剑指offer 面试题39:判断平衡二叉树 提交网址:  http://www.nowcoder.com/practice/8b3b95850edb4115918ecebdf1b4d222?tpId= ...

  7. Leetcode - 剑指offer 面试题29:数组中出现次数超过一半的数字及其变形(腾讯2015秋招 编程题4)

    剑指offer 面试题29:数组中出现次数超过一半的数字 提交网址: http://www.nowcoder.com/practice/e8a1b01a2df14cb2b228b30ee6a92163 ...

  8. C++版 - 剑指Offer 面试题39:二叉树的深度(高度)(二叉树深度优先遍历dfs的应用) 题解

    剑指Offer 面试题39:二叉树的深度(高度) 题目:输入一棵二叉树的根结点,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度.例如:输入二叉树 ...

  9. C++版 - 剑指offer 面试题24:二叉搜索树BST的后序遍历序列(的判断) 题解

    剑指offer 面试题24:二叉搜索树的后序遍历序列(的判断) 题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则返回true.否则返回false.假设输入的数组的任意两个 ...

  10. C++版 - 剑指Offer 面试题45:圆圈中最后剩下的数字(约瑟夫环问题,ZOJ 1088:System Overload类似)题解

    剑指Offer 面试题45:圆圈中最后剩下的数字(约瑟夫环问题) 原书题目:0, 1, - , n-1 这n个数字排成一个圈圈,从数字0开始每次从圆圏里删除第m个数字.求出这个圈圈里剩下的最后一个数字 ...

随机推荐

  1. Cocos移植到Android的一些问题-中文乱码问题

    Android平台版本和设备碎片化很严重,因此从Win32平台移植到Android平台会有很多问题,下面是我们归纳的从Win32平台移植到Android平台遇到的一些问题.在Android平台中文乱码 ...

  2. 使用C++读取UTF8及GBK系列的文本方法及原理

    作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4374404.html 1.读取UTF-8编码文本原理 首先了解UTF-8的编码方式,UTF- ...

  3. nss_12 上传文件后返回jsonresult结果,IE中出现文件下载框

    因为控制器返回的是JsonResult, 但是在IE8中一直返回文件下载的对话框. 转到谷歌浏览器倒没有问题. 网上找的方法, 要么是跟到一个新的成功页面, 要么是直接返回html, 觉得应该有更好的 ...

  4. iframe整理学习笔记

    朋友问了一个比较怪的问题,iframe下自适应的问题,因为很少使用iframe的原因,怀着对iframe的疑惑采用了一点点实践;以下frame表示针对的iframe元素 解决的方法:对iframe进行 ...

  5. -sh: ./helloworld: not found

    最近在玩FriendlyARM mini2440的板子,编译了一个helloworld,通过ftp上传到开发版的文件系统中,chmod 777 helloworld,运行./helloworld,出现 ...

  6. jar 命令打war包

    假定有一个Web应用:C:\myHomemyHome/WEB-INF/……myHome/files/……myHome/image/……myHome/src/……myHome/index.jsp在命令行 ...

  7. Python的类实例方法,类方法,类静态方法

    以下面的类定义为例: # coding:utf-8 class A: count = 0 def __init__(self, inst_name): self.inst_name = inst_na ...

  8. 使用另一种方式实现js中Function的调用(call/apply/bind)

    在JavaScript中函数的调用可以有多种方式,但更经典的莫过于call和apply.call跟apply都绑定在函数上,他们两个的第一个参数意义相同,传入一个对象,他作为函数的执行环境(实质上是为 ...

  9. oracle11g关于表空间的问题

    1.oracle11g默认的块大小为8K  每个表空间里面的单个数据文件最大为32G   (2^22-1) *4k   最多可以放1024个单个文件    SQL> show parameter ...

  10. ActiveMQ之TemporaryQueue和TemporaryTopic

    TemporaryQueue和TemporaryTopic,从字面上就可以看出它们是“临时”的目的地.可以通过Session来创建,例如: TemporaryQueue replyQueue = se ...