携程笔试中的一道编程题

题目:字符串去符号。

将输入的一串字符串中的标点符号都删掉。

输入样例:
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;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值