1. 程式人生 > >攜程筆試中的一道程式設計題

攜程筆試中的一道程式設計題

題目:字串去符號。

將輸入的一串字串中的標點符號都刪掉。

輸入樣例:
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;
}