题目:替换字符串中的空格为“%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. 【学习笔记】【C语言】关系运算符

    1. 条件判断 默认情况下,我们在程序中写的每一句正确代码都会被执行.但很多时候,我们想在某个条件成立的情况下才执行某一段代码 这种情况的话可以使用条件语句来完成,但是我们暂时不学习条件语句,先来看一 ...

  2. Codevs 1205 单词翻转

    时间限制: 1 s  空间限制: 128000 KB  题目等级 : 青铜 Bronze 题解       题目描述 Description 给出一个英语句子,希望你把句子里的单词顺序都翻转过来 输入 ...

  3. 【风马一族_Android】Android 从命令行界面获取手机信息

    Android 从命令行界面获取手机信息 1: cmd 打开命令行界面 2:adb devices   获取与电脑相连的设备,例如:模拟器.真机(手机) (右击“标记”,选择设备名称,点击“Ctrl+ ...

  4. 6.ipv6地址配置

    1. "nmcli connection modify 网卡名 ipv4.addresses "ipv6地址" ipv6.method manual ". 2. ...

  5. PHP实现链式操作的原理

    在一个类中有多个方法,当你实例化这个类,并调用方法时只能一个一个调用,类似: db.php <?php class db{ public function where() { //code he ...

  6. Apache 2.4 多站点配置记录

    基于域名的虚拟主机配置 <VirtualHost *:80> DocumentRoot /var/www/cms ServerName www.example.com RewriteEng ...

  7. (转)可收缩、扩展的TextView

    在一些应用中,比如腾讯的应用市场APP应用宝,关于某款应用的介绍文字,如果介绍文字过长,那么不是全部展现出来,而是显示三四行的开始部分(摘要),预知全部的内容,用户点击展开按钮即可查阅全部内容.这样的 ...

  8. js读取json数据(php传值给js)

    <?php $array =array('fds','fdsa','fdsafasd');  // json_encode($array); ?> <html> <hea ...

  9. 关于华为C8812救砖教程

    问题:华为C8812刷机后,开机显示:---------------------------------------------------------------- Image signature ...

  10. openerp学习笔记 自定义小数精度(小数位数)

    小数位数标识定义: lx_purchase/data/lx_purchase_data.xml <?xml version="1.0" encoding="utf- ...