华为笔试算法面试题与参考答案分析【基于C++】
Cookie小甜饼
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. 字符串解压缩,并且排序输出