1. 二叉树遍历
Total 【2434】、 AC rate 【2.10%】
Description
给定一棵满二叉树树先序遍历的输出结果,求该树中序遍历的输出结果。
Input
2^n - 1个数字(n是≤16的正整数),每个数字的取值范围[0, 255], 数字之间用逗号分割。
Output
树的中序遍历结果,数字之间通过逗号分割。
Sample Input 1
1,2,3,4,5,6,7
Sample Output 1
3,2,4,1,6,5,7
Hint
不要有任何多余的输出 C/C++,换行为"\n"
代码
#include <stdio.h>
void mid_reverse(int root[],int length, int idx, int target[], int &count) {
if (idx > length) {
return;
}
mid_reverse(root, length, idx * 2 + 1, target, count);
target[count++] = root[idx];
mid_reverse(root, length, idx * 2 + 2, target, count);
}
void pre_reverse(int root[],int length, int idx, int target[], int &count) {
if (idx >= length) {
return;
}
target[idx] = root[count++];
pre_reverse(root, length, idx * 2 + 1, target, count);
pre_reverse(root, length, idx * 2 + 2, target, count);
}
int main()
{
// 处理 输入
char c;
int i = 0;
int k = 1;
int num = -1;
int root[10000] = {0};
do {
c = getchar();
if(k != 1 && (c == ',' || c == '\n' || c == EOF)) {
root[++num] = i;
i = 0;
k = 1;
} else {
i = c - '0' + i * 10;
k = 0;
}
}while(c != '\n' && c != EOF);
// 父节点 root -> left 2 i + 1 -> right 2 i + 2 从 0 开始顺序表
int pre_root[++num] = {0};
int target[num] = {0};
int a = 0;
int idx = 0;
int count = 0;
pre_reverse(root, num, 0, pre_root, count);
count = 0;
mid_reverse(pre_root, num, 0, target, count);
for(int i =1; i < num; i++) {
printf("%d,", target[i]);
}
printf("%d\n",target[num]);
return 0;
}
2. 手机号码格式化
Total 【914】、 AC rate 【0.00%】
Description
四达在非洲各国运营均涉及到了短信业务,客户输入的手机号存在多样性,我们需要对客户的手机号做规范化处理。我们以尼日、肯尼亚、乌干达、卢旺达的短信业务为例,国际区号对应如下:
尼日 +234
卢旺达 +250
肯尼亚+254
乌干达+256
手机号码位数,要求如下:
尼日10位
卢旺达9位,且手机号不能为0开头
肯尼亚9位
乌干达9位
要求:根据上面四国的手机号位数,提取出正确的手机号,然后再格式化输出
Input
第一行输入客户的手机号
如果客户输入+2340794120365,那么我们提取的9位手机号就是794120365,提取的10位手机号是0794120365
如果客户输入+0794120365,那么我们提取的9位手机号就是794120365,提取的10位手机号是0794120365
如果客户输入00000794120365,那么我们提取的9位手机号就是794120365,提取的10位手机号是0794120365,因为我们认为手机号前面可以有0,但也要获取到正确的手机号
如果客户输入+2345abc,那么是无法提取到合法的手机号的
总之,客户输入的是一个20位以内的任意字符,我们需要根据规则提取出有效的手机号
Output
提取到手机号后,按尼日、卢旺达、肯尼亚、乌干达顺序,输出格式化后的手机号
输出格式为:国际区号 + 手机号,其中肯尼亚国际区号不带+号,其他国必需带+号
Sample Input 1
0794120365
Sample Output 1
+2340794120365
+250794120365
254794120365
+256794120365
Sample Input 2
+234794120365
Sample Output 2
无
+250794120365
254794120365
+256794120365
Sample Input 3
+240794120365
Sample Output 3
无
无
无
无
Sample Input 4
250787678
Sample Output 4
无
+250250787678
254250787678
+256250787678
Sample Input 5
0012345678
Sample Output 5
+2340012345678
无
254012345678
+256012345678
3. 斐波那契数列拆分
Total 【1339】、 AC rate 【0.60%】
Description
现在有一个无限大的斐波那契数列构成的数组arr, 现给定一个整数N和一个整数K, 将N拆分成K个整数n1, n2,…,nk , (可以拆分成两个相同的数,例如 N= 10 K= 2 就可以拆分成 n1 = 5 , n2 = 5) , 并且n1, n2,…,nk都属于arr , 如果可以满足这种拆分返回Yes, 否则返回No.
Input
输入顺序为:
整数N 整数K,其中整数N和K之间用一个空格分隔,满足条件(1≤N<10^9 ,1≤K≤1000)
Output
输出为Yes 或者No
Sample Input 1
10 2
Sample Output 1
Yes
Sample Input 2
10 1
Sample Output 2
No
Sample Input 3
12 3
Sample Output 3
Yes
Sample Input 4
12 12
Sample Output 4
Yes