题目:替换字符串中的空格为“%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. UIAlertView[警告框] [代理协议型]UIActionSheet [表单视图][代理协议型]

    ////  ViewController.h//  UIAlertViewAndUIActionSheet////  Created by hehe on 15/9/21.//  Copyright ...

  2. 密码强度的js插件(完成)

    效果如下图: 低:

  3. UI3_UILabel

    // // AppDelegate.m // UI3_UILabel // // Created by zhangxueming on 15/6/29. // Copyright (c) 2015年 ...

  4. AMQ学习笔记 - 21. 异步发送

    原文地址:Async Sends 背景 ActiveMQ支持同步.异步两种发送的模式将消息发送到broker,模式的选择对发送延时有巨大的影响.producer能达到怎样的产出率[1],主要受发送延时 ...

  5. websphere中由于实际应用没有卸载干净,导致安装不了。以下是完全卸载应用程序的方法

     出现此问题的原因之一:操作界面上没有卸载完成.进行一下操作:1.删除 $WAS_HOME/profiles/AppSrv01/config/cells/...cell/applications下对应 ...

  6. Android基本知识

         Android是Google公司于2007年发布的基于Linux内核的手机操作系统.应用层主要以java为编程语言,应用层分为两层,函数层(Library) 和虚拟机(Virtual).中间 ...

  7. 关于ionic的跨域问题

    例如你的api原地址请求是 http://10.100.100.100:8080/service/, 1.那么你应该在项目内api请求改成 /service/, 注意红色部分是ionic serve ...

  8. for xml path以及sql合并查询

    sql中for xml path的用法. http://www.cnblogs.com/yanghaibo/archive/2010/06/04/1751405.html

  9. 飞行器的Pitch Yaw Roll概念图解

    前进方向为Z轴 Pitch 升降 绕X轴  对应常见Φ(phi)角: Yaw 偏航 绕Y轴 对应常见θ(theta)角: Roll 翻滚 绕Z轴 对应常见φ(psi)角: 对应表: 参考网址NASA: ...

  10. 管道和FIFO

    pipe 子进程从终端读取一个文件名, 通过管道将文件名传递给父进程 父进程收到文件名后, 读取文件内容并通过管道传递给子进程 子进程接收到文件内容并输出到终端 #include <stdio. ...