题目:字符串去符号。
将输入的一串字符串中的标点符号都删掉。
输入样例:
String:a1,b2.c3-d4!
输出样例:
Stringa1b2c3d4
最一开始想到的就是剑指offer中的{面试题4:替换空格}
时间也很紧就大概想了想没有怎么认真考虑。
结果出现覆盖现象。
然后我就换成了两个数组一个遍历一个赋值。
代码如下:
#include <iostream>
#include <vector>
#include <numeric>
#include <limits>
#include<string>
using namespace std;
#define N 100
char* change(char putin[],int n)
{
if(putin == NULL)
return NULL;
int strcount = 0;
for(int i = 0;i<n;++i)
{
if((putin[i]>='a'&&putin[i]<='z')||(putin[i]>='A' && putin[i]<='Z')||(putin[i]>='0'&&putin[i]<='9'))
++strcount;
}
int p1 = n-1;
int p2 = strcount-1;
char *putout = new char[strcount];
putout[strcount] = '\0';
while( p2>=0)
{
if((putin[p1]>='a'&&putin[p1]<='z')||(putin[p1]>='A' && putin[p1]<='Z')||(putin[p1]>='0'&&putin[p1]<='9'))
{
putout[p2--] = putin[p1--];
}
else
{
--p1;
}
}
return putout;
}
int main()
{
char putin[N];
char *putout;
gets(putin);
int n = strlen(putin);
putout = change(putin,n);
puts(putout);
}
回顾剑指offer中的替换空格:
题目:
请实现一个函数,把字符串中的每个空格替换成“%20”。
输入样例:
we are happy.
输出样例:
we%20are%20happy.
考虑到如果从前往后换的话,每遇到一个空格后面那一大堆就要移动,这样时间复杂度就有点大了。
从后开始移动就好多了,因为新的字符串一定比旧的长或相等,只要不是短就不会出现覆盖的现象。
具体的实现过程如下:
代码:
#include<iostream>
using namespace std;
void ReplaceBlank(char string[],int length)
{
if(string == NULL||length <= 0) //注意考虑这些边边角角的问题
return;
int originalLength = 0;
int numOfBlank = 0;
int i=0;
while(string[i] != '\0') //统计string字符串的真是长度和空格长度
{
++originalLength;
if(string[i] == ' ')
++numOfBlank;
++i;
}
int newLength = originalLength + numOfBlank*2;
if(newLength > length)
return;
int p1 = originalLength;
int p2 = newLength;
while(p1 >= 0 && p2 > p1) //这个限制条件很重要!!!
{
if(string[p1] == ' ')
{
string[p2--] = '0';
string[p2--] = '2';
string[p2--] = '%';
}
else
{
string[p2--] = string[p1];
}
--p1;
}
}
int main()
{
char string[50];
gets(string);
ReplaceBlank(string,50);
puts(string);
}
举一反三题:
有两个排序的数组A1和A2,内存在A1末尾有足够多的空余空间容纳A2。请实现一个函数,把A2中的所有数字插入到A1中并且所有数字都是排序的。
#include<iostream>
using namespace std;
#define N 5
void merge_num(int numA1[],int numA2[],int n1,int n2)
{
int p1 = n1-1;
int p2 = n2-1;
int p3 = n1+n2-1;
while(p1>=0 && p2>=0)
{
if(numA1[p1] >= numA2[p2])
numA1[p3--] = numA1[p1--];
else if(numA1[p1] < numA2[p2])
numA1[p3--] = numA2[p2--];
}
if(p2 == 0)
{
numA1[p3] = numA2[p2];
}
}
int main()
{
int numA1[2*N] = {2,4,9,11,15,16,20};
int numA2[N] = {3,9,14};
merge_num(numA1,numA2,7,3);
for(int i=0;i<2*N;++i)
{
cout<<numA1[i]<<"-->";
}
cout<<endl;
}