腾讯暑期实习笔试笔记
题目:现存在一棵满二叉树,第一行为1,第二行为2 、3,第三行为4、5、6、7等等。以此类推,现要求输入n行,每行包含两个数x, k 求x在该二叉树下第k行的祖先节点,并打印出祖先节点。若该行没有祖先结点,则输出-1;
eg:
输入为:
4
10 1
10 2
10 3
10 4
输出:
1
2
5
-1
实现代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static void Main(string[] args)
{
string line;
Dictionary<int, List<int>> result = new Dictionary<int, List<int>>();
List<int> results = new List<int>();
while ((line = Console.ReadLine()) != null)
{
int n = int.Parse(line);
HashSet<int> info = new HashSet<int>();
for (int i = 0; i < n; i++)
{
line = Console.ReadLine();
List<int> lineInfo = line.Split(' ').ToList().Select(t => int.Parse(t)).ToList();
List<int> value = new List<int>();
if(result.TryGetValue(lineInfo[0], out value))
{
if (value.Count - lineInfo[1] >= 0)
results.Add(value[ value.Count - lineInfo[1]]);
else
results.Add(-1);
}
else
{
List<int> value1 = new List<int>();
int u = lineInfo[0];
while(u /2 != 0)
{
value1.Add(u / 2);
u = u / 2;
}
result.Add(lineInfo[0], value1);
results.Add(value1[value1.Count - lineInfo[1]]);
}
}
foreach (var i in results)
Console.WriteLine(i);
}
}
}