# 华为2016暑假实习机试题

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

int main() {

string str;
cin >> str;
int len = str.size();
for (int i = 0; i < len; ++i)
if (str[i] <= 'Z' && str[i] >= 'A')
cout << str[i];

}

#include <iostream>
using namespace std;

int cmp(const void* a, const void* b) {
return (*(int*)a - *(int*)b);
}

int main() {

int n, i;
cin >> n;
if (n <= 0) return 1;
if (n == 1) {
cin >> n;
cout << n;
return 0;
}
int* arr = new int[n];
for (i = 0; i < n; ++i)
cin >> arr[i];
qsort(arr, n, sizeof(int), cmp);
cout << arr[0];
for (i = 1; i < n; ++i)
if (arr[i] != arr[i - 1])
cout << " " << arr[i];
}

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

struct TreeNode
{
char val;
TreeNode* left;
TreeNode* right;
TreeNode() {};
TreeNode(char val) {
this->val = val;
this->left = this->right = NULL;
}
};

void buildTree(TreeNode*[], int);
int findDepth(TreeNode*[], char);
int getDepth(TreeNode*);
int max(int , int);

int main() {
string tree, nodes;
cin >> tree >> nodes;
int len = tree.size();
//int maxLevel = tree[len - 1] - '0'; // 由于最大层可能不是在最后一个字符，例如a1b2c2d3e3f3和b2c2d3e3f3a1是两棵完全一样的树
int maxLevel = 0;
for (int i = 1; i < len; i += 2) {
if ((tree[i] - '0') > maxLevel)
maxLevel = (tree[i] - '0');
}
TreeNode* trees[512] = {NULL}; // 最大层数为9层
int offset[9] = { 0 };
// 初始化树节点
for (int i = 0; i < len - 1; ++i) {
int level = tree[i + 1] - '0';
int levelBeg = _Pow_int(2, level - 1) - 1; // 每一层的起点为2^(level - 1) - 1
trees[levelBeg + offset[level - 1]] = new TreeNode(tree[i]); // 层数的下标从0开始
offset[level - 1]++;
i++; // 跳过数字
}
// 建树
buildTree(trees, maxLevel);
// 输出每个节点的深度
int test = nodes.size();
for (int i = 0; i < test - 1; ++i) {
cout << findDepth(trees, nodes[i]) << " ";
}
cout << findDepth(trees, nodes[test - 1]) << endl;
}

void buildTree(TreeNode* root[], int maxLevel) {
int total = _Pow_int(2, maxLevel) - 1;
for (int i = total / 2 - 1; i >= 0; --i) {
if (root[i] != NULL) {
root[i]->left = root[2 * i + 1];
root[i]->right = root[2 * i + 2];
}
}
}

int max(int a, int b) {
return a > b ? a : b;
}

int getDepth(TreeNode* root) {
if (root == NULL)
return 0;
return max(getDepth(root->left), getDepth(root->right)) + 1;
}

int findDepth(TreeNode* root[], char ch) {
bool flag = false;
for (int i = 0; i < 512; ++i)
if (root[i] != NULL && root[i]->val == ch)
return getDepth(root[i]);
return 0;
}

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

int main() {
string str, testcase;
cin >> str;
cin >> testcase;
// 特殊情况判断
if (str.size() <= 1 || testcase.size() <= 0)
return -1;
int lvl[256];
for (int i = 0; i < 256; ++i)
lvl[i] = 10;	// 依题意最大层数不超过9层,且层数从1计起，其他不在树的节点默认为10
int lvlPos[256] = { 0 };	// 记录每个节点在所在层的位置，从1计起
int numPerLvl[11] = { 0 };	// 记录每一层的节点数，最大层数不超过9层,且层数从1计起
int len = str.size();
int tlen = testcase.size();

for (int i = 0; i < len - 1; i += 2) {
// 保留每个节点所在的层数
lvl[str[i]] = str[i + 1] - '0';
//	记录每个节点在所在层偏移的位置，按照完全二叉树的规律，节点的左右儿子为2*n-2, 2*n-1)
lvlPos[str[i]] = ++numPerLvl[lvl[str[i]]];
}

for (int i = 0; i < tlen; ++i) {
// 当节点不在树中，输出0
if (lvl[testcase[i]] == 10) {
cout << 0 << endl;
continue;
}
int depth = 1;
int level = lvl[testcase[i]];
int childNum = lvlPos[testcase[i]];
for (int k = lvl[testcase[i]]; k < 10; ++k) {
// 对于每一层的节点，计算由偏移量得出的儿子数目个数，若少于2*n-1则表示没儿子
childNum = 2 * childNum - 1;
if (numPerLvl[level + 1] < childNum) {
break;
}
else {	// 若有儿子，则继续往儿子方向迭代计数
depth++;
level++;
}
}
cout << depth << endl;
}
}

• 本文已收录于以下专栏：

## 2017华为实习机试题（java）

• fengsigaoju
• 2017年03月25日 10:07
• 1975

## 华为2017暑期实习生面试体会

• sinat_23118323
• 2017年04月08日 19:31
• 1936

## 华为校招JAVA机试题

• TaoTaoFu
• 2017年01月09日 22:17
• 1755

## 华为2016实习机试题

• hyp1977
• 2016年07月17日 21:46
• 499

## 华为 2016实习生 上机考试 题目

• u010161379
• 2016年04月02日 15:25
• 2921

## 京东2016暑假实习机试题（部分）

• shen_jz2012
• 2016年05月09日 11:24
• 1617

## 百度2016暑假实习机试题（部分）

• shen_jz2012
• 2016年05月10日 10:36
• 1036

## 华为2016机试题

2016年华为机试三题都比较简单，很容易AC； 第一题：不说了 第二题：m取值区间小，计算完后可以直接打表 第三题：字符串处理...
• u012605629
• 2015年08月13日 21:12
• 600

## 2017年腾讯暑假实习面试总结

• weixin_35909255
• 2017年04月20日 00:45
• 490

## 谈谈大三找暑假实习

• tian33133
• 2015年06月02日 23:32
• 1294

举报原因： 您举报文章：华为2016暑假实习机试题 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)