📜  Google 软件工程实习生,2019 年秋季 – 北美

📅  最后修改于: 2021-10-23 07:34:09             🧑  作者: Mango

1. 考虑 N 个顶点的二叉树,使得节点 k 的子节点为 2*k 和 2*k+1。顶点 1 是树的根,每个节点都有一个与之关联的整数值。

通过记下来自连续节点的值,这样的树可以表示为 N 个整数的数组。

树可以表示为数组 [-1, 7, 0, 7, -8]。
如果该节点与根 x-1 之间的最短路径的长度为 x-1,则称该节点处于级别 x。所以,根在 1 级,根的孩子在 2 级,依此类推。

你的任务是找到最小的级别数 x,使得级别 x 的所有节点的总和最大。
示例:给定数组 A 使得:A[0]=-1, A[1]=7, A[2]=0, A[3]=7, A[4]=-8。该函数应返回 2。

Input : [-1, 7, 0, 7, -8] 
Output : 2
#include 
using namespace std;
int solution(int a[], int n)
{
    int max = -1;
    int temp = 0;
    for (int i = 0; i < n; i = i + 2) {
        if (i == 0)
            temp = a[i];
        else
            temp = a[i] + a[i - 1];
        if (temp > max)
            max = i;
    }
    return max;
}
  
int main()
{
    int a[4];
    a[0] = -1, a[1] = 7, a[2] = 0, a[3] = 7, a[4] = -8;
    int size = 4;
    cout << solution(a, size);
}

2. 假设您有一个特殊的键盘,所有键都排成一行。键盘上的字符布局由长度为 26 的字符串S1 表示。S1 的索引从 0 到 25。最初,您的手指位于索引 0。要键入字符,您必须将手指移动到所需的字符。将手指从索引 i 移动到索引 j 所花费的时间是 |ji|,其中 ||表示绝对值。

编写一个函数解决方案(),给定一个描述键盘布局的字符串S1 和一个字符串S2,返回一个整数,表示键入字符串S2 所花费的时间。

例子:

S1 = abcdefghijklmnopqrstuvwxyz

S2 = cba

Input : S1 = abcdefghijklmnopqrstuvwxyz, S2 = cba 
Output : 4
#include 
using namespace std;
  
int solution(string& s1, string& s2)
{
    map dict;
    for (int i = 0; i < 26; i++) {
        dict[s1[i]] = i;
    }
    int ans = 0;
    int prev = 0;
    for (int i = 0; i < s2.length(); i++) {
        ans = ans + abs(dict[s2[i]] - prev);
        prev = dict[s2[i]];
    }
    return ans;
}
  
int main()
{
    string s1 = "abcdefghijklmnopqrstuvwxyz";
    string s2 = "cba";
    cout << solution(s1, s2);
}