剑指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个数字.求出这个圈圈里剩下的最后一个数字 ...
随机推荐
- 【学习笔记】【C语言】数组
1. 什么是数组 数组,从字面上看,就是一组数据的意思,没错,数组就是用来存储一组数据的 2. 数组的特点 只能存放一种类型的数据,比如int类型的数组.float类型的数组 里面存放的数据称为“元素 ...
- vlan知识
为什么需要VLAN 1. 什么是VLAN? VLAN(Virtual LAN),翻译成中文是“虚拟局域网”.LAN可以是由少数几台家用计算机构成的网络,也可以是数以百计的计算机构成的企业网络.VLAN ...
- tomcat的OutOfMemoryError(PermGen space)解决方法
修改TOMCAT_HOME/bin/catalina.bat,在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行: set J ...
- VmodCAM图像采集 VGA显示
先上图 总体框图 效果图 效果不是很好,因为暂时用的是zedboard自带的VGA,其只能RGB只有3*3*3的彩色度 VmodCAM原理图 VmodCAM的zedboard管脚约束见:http:// ...
- webBrowser执行js的方法,并返回值,c#后台取值
private void Form1_Load(object sender, EventArgs e) { webBrowser1.Navigate(Application.StartupPath + ...
- AngularJS(13)-包含
AngularJS 包含 使用 AngularJS, 你可以使用 ng-include 指令来包含 HTML 内容: 实例 <body> <div class="conta ...
- vim配置python开发环境
vim配置python开发环境 一.安装vim sudo apt-get install vim 二.vim基础配置 #Centos6.5 /usr/share/vim/vim72 vi /etc/v ...
- php基础小知识
1.php中的双引号可以正确的解析变量与转义序列,而单引号只会按照声明原样显示:双里面的字段会经过编译器解释,然后再当作HTML代码输出:单引号里面的不进行解释,直接输出. 2.转义序列是针对源代码的 ...
- 使用 Visual Studio Team Test 进行单元测试和java中的测试
C#中test测试地 方法一. 1.从NUnit官网(http://www.nunit.org/index.php)下载最新版本NUnit,当前版本为NUnit2.5.8. 2.安装后,在VS2008 ...
- fast_recovery_area无剩余空间(ORA-19815)
一.问题现象 --执行日志切换时,夯住 SQL ('/u01/oradata/oracle/redo04.log') size 50m; SQL> alter system switch log ...