华为笔试算法面试题——C++实现

1.   26进制的字符串相加

两个大整数相加,每一位是一个小写字母,二十六进制,a表示0,z表示25,求结果。  输入: 2个26进制数;    输出:  2个26进制的和。  实例: 输入:  z        bc         输出: cb

#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;

int main()
{
	char str1[205], str2[205];
	int num1[205], num2[205], num[205];
	int i;
	while (cin >> str1 >> str2)
	{
		memset(num1, 0, sizeof(num1));
		memset(num2, 0, sizeof(num2));
		memset(num, 0, sizeof(num));
		int tmp = 0;
		for (i = strlen(str1) - 1; i >= 0; i--)
			num1[++tmp] = str1[i] - 'a';
		tmp = 0;
		for (i = strlen(str2) - 1; i >= 0; i--)
			num2[++tmp] = str2[i] - 'a';
		for (i = 1; i <= 202; i++)
			num[i] = num1[i] + num2[i];
		for (i = 1; i <= 202; i++)
			num[i + 1] += num[i] / 26, num[i] %= 26;

		int mk = 0;
		for (i = 202; i >= 1; i--)
		{
			if (num[i]) mk = 1;
			if (mk) printf("%c", num[i] + 'a');
		}
		if (!mk) printf("a");
		puts("");
	}
	return 0;
}

2.   两个字符串包含问题

两个字符串input1,和字符串input2,字符串元素的值域是26个大写字母,判断input2中的所有字符是否都包含在字符串input1中。 如果包含返回:ture, 否则返回:false

输入:  两个字符串: input1和input2,其中input1的长度大于input2。要求两个输入字符串input1和input2的长度不小于5. 如:A字符串:BBDDCFFE,B字符串:LCEFB

输出:true或false

位图思想:

 无论是字符串1还是字符串2,都是由【a-z】字母组成的,所以最多只有26个字母,所以只要一个整数(32位)就可以表示字符串所表示的字母,假设这个字母出现,则对应的位置1,那么就算26个字母都出现了,也只需要26位置1.

#include <iostream>
#include <sstream>
#include <map>
#include <string.h>
using namespace std;

bool is_contained(string str1, string str2)
{
	int strmap = 0;
	const char * pstr = str1.data();
	while (*pstr != '\0')
	{
		strmap |= (1 << (*pstr - 'a'));
		pstr++;
	}
	pstr = str2.data();
	bool iscontained = true;
	while (*pstr != '\0')
	{
		if ((strmap & (1 << (*pstr - 'a'))) == 0)
		{
			iscontained = false;
			break;
		}
		pstr++;
	}
	return iscontained;
}
int main()
{
	string str1, str2;
	while (getline(cin, str1))
	{
		getline(cin, str2);
		if (str1.length() >= 5 && str2.length() >= 5 && (str1.length() > str2.length()))
		{
			if (is_contained(str1, str2))			
				cout << "true" << endl;		
			else
				cout << "false" << endl;
		}
		else
			cout << "error: 字符串长度小于5" << endl;
	}
	return 0;
}

第二种方法:

#include <iostream>  
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

string matchStr(string str1, string str2)
{
	string flag = "true";
	int len1 = str1.size();
	int num = 0;
	vector<int> pos;
	for (int i = 0; i < len1 - 1; ++i)
	{
		if (str1[i + 1] == str1[i])
			pos.push_back(i + 1);
	}
	for (int i = 0; i < pos.size(); i++)
	{
		int tmp = pos[i] - i;
		str1.erase(str1.begin() + tmp);
	}
	for (int i = 0; i < str2.size(); i++)
	{
		num = str1.find(str2[i]);
		if (num < 0)
		{
			flag = "false";
			break;
		}
		else
			continue;
	}
	return flag;
}
int main()
{
	string Str1, Str2;
	cin >> Str1;
	cin >> Str2;
	string Res = matchStr(Str1, Str2);
	cout << Res << endl;
	return 0;
}

3.   字符串解压缩,并且排序输出

 

《华为笔试算法面试题——C++实现》    《华为笔试算法面试题——C++实现》

 

 

 

 

    原文作者:Cookie小甜饼
    原文地址: https://blog.csdn.net/image_fzx/article/details/82431082
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞