剑指offer--面试题4
题目:替换字符串中的空格为“%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的更多相关文章
- 剑指Offer:面试题15——链表中倒数第k个结点(java实现)
问题描述 输入一个链表,输出该链表中倒数第k个结点.(尾结点是倒数第一个) 结点定义如下: public class ListNode { int val; ListNode next = null; ...
- 剑指offer面试题3 二维数组中的查找(c)
剑指offer面试题三:
- 剑指Offer——笔试题+知识点总结
剑指Offer--笔试题+知识点总结 情景回顾 时间:2016.9.23 12:00-14:00 19:00-21:00 地点:山东省网络环境智能计算技术重点实验室 事件:笔试 注意事项:要有大局观, ...
- C++版 - 剑指offer之面试题37:两个链表的第一个公共结点[LeetCode 160] 解题报告
剑指offer之面试题37 两个链表的第一个公共结点 提交网址: http://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46?t ...
- C++版 - 剑指offer 面试题23:从上往下打印二叉树(二叉树的层次遍历BFS) 题解
剑指offer 面试题23:从上往下打印二叉树 参与人数:4853 时间限制:1秒 空间限制:32768K 提交网址: http://www.nowcoder.com/practice/7fe2 ...
- C++版 - 剑指offer 面试题39:判断平衡二叉树(LeetCode 110. Balanced Binary Tree) 题解
剑指offer 面试题39:判断平衡二叉树 提交网址: http://www.nowcoder.com/practice/8b3b95850edb4115918ecebdf1b4d222?tpId= ...
- Leetcode - 剑指offer 面试题29:数组中出现次数超过一半的数字及其变形(腾讯2015秋招 编程题4)
剑指offer 面试题29:数组中出现次数超过一半的数字 提交网址: http://www.nowcoder.com/practice/e8a1b01a2df14cb2b228b30ee6a92163 ...
- C++版 - 剑指Offer 面试题39:二叉树的深度(高度)(二叉树深度优先遍历dfs的应用) 题解
剑指Offer 面试题39:二叉树的深度(高度) 题目:输入一棵二叉树的根结点,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度.例如:输入二叉树 ...
- C++版 - 剑指offer 面试题24:二叉搜索树BST的后序遍历序列(的判断) 题解
剑指offer 面试题24:二叉搜索树的后序遍历序列(的判断) 题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则返回true.否则返回false.假设输入的数组的任意两个 ...
- C++版 - 剑指Offer 面试题45:圆圈中最后剩下的数字(约瑟夫环问题,ZOJ 1088:System Overload类似)题解
剑指Offer 面试题45:圆圈中最后剩下的数字(约瑟夫环问题) 原书题目:0, 1, - , n-1 这n个数字排成一个圈圈,从数字0开始每次从圆圏里删除第m个数字.求出这个圈圈里剩下的最后一个数字 ...
随机推荐
- UIAlertView[警告框] [代理协议型]UIActionSheet [表单视图][代理协议型]
//// ViewController.h// UIAlertViewAndUIActionSheet//// Created by hehe on 15/9/21.// Copyright ...
- 密码强度的js插件(完成)
效果如下图: 低:
- UI3_UILabel
// // AppDelegate.m // UI3_UILabel // // Created by zhangxueming on 15/6/29. // Copyright (c) 2015年 ...
- AMQ学习笔记 - 21. 异步发送
原文地址:Async Sends 背景 ActiveMQ支持同步.异步两种发送的模式将消息发送到broker,模式的选择对发送延时有巨大的影响.producer能达到怎样的产出率[1],主要受发送延时 ...
- websphere中由于实际应用没有卸载干净,导致安装不了。以下是完全卸载应用程序的方法
出现此问题的原因之一:操作界面上没有卸载完成.进行一下操作:1.删除 $WAS_HOME/profiles/AppSrv01/config/cells/...cell/applications下对应 ...
- Android基本知识
Android是Google公司于2007年发布的基于Linux内核的手机操作系统.应用层主要以java为编程语言,应用层分为两层,函数层(Library) 和虚拟机(Virtual).中间 ...
- 关于ionic的跨域问题
例如你的api原地址请求是 http://10.100.100.100:8080/service/, 1.那么你应该在项目内api请求改成 /service/, 注意红色部分是ionic serve ...
- for xml path以及sql合并查询
sql中for xml path的用法. http://www.cnblogs.com/yanghaibo/archive/2010/06/04/1751405.html
- 飞行器的Pitch Yaw Roll概念图解
前进方向为Z轴 Pitch 升降 绕X轴 对应常见Φ(phi)角: Yaw 偏航 绕Y轴 对应常见θ(theta)角: Roll 翻滚 绕Z轴 对应常见φ(psi)角: 对应表: 参考网址NASA: ...
- 管道和FIFO
pipe 子进程从终端读取一个文件名, 通过管道将文件名传递给父进程 父进程收到文件名后, 读取文件内容并通过管道传递给子进程 子进程接收到文件内容并输出到终端 #include <stdio. ...