一道google的面试题(据说)

1. 原题(同事给的)

Max Howell 参加了谷歌的面试,出题人竟然要求 Max Howell 在白板上作出解答,Max Howell 当然愤怒地拒绝了,回家以后马上在微博上跟我们分享他的吐槽:

Google: 90% of our engineers use the software you wrote (Homebrew), but you can’t invert a binary tree on a whiteboard so fuck off.
看来在白板上作出反转二叉树的解答并不容易呢?那么在 ScriptOJ 有上 OJ 系统会不会更方便一些呢?

假如有这样一个二叉树,

          4
        /   \
      3      2
    /  \    / \
  7     1  2   3
 / \   /   
6   5 9
使用广度优先的原则用数组的表示就是 [4, 3, 2, 7, 1, 2, 3, 6, 5, 9, null, null, null, null, null],二叉树中的空位用 null 表示。

进行反转以后会变成

          4
        /   \
      2      3
    /  \    /  \
  3     2  1     7
            \   /  \  
             9 5    6
使用广度优先的原则用数组的表示就是 [4, 2, 3, 3, 2, 1, 7, null, null, null, null, null, 9, 5, 6]。

请实现函数 invertTree,它接受一个表示二叉树的数组,返回表示这个反转二叉树的数组。

请注意,提交后提示中显示的 1,2,3,,,4,5 表示的是 1, 2, 3, null, null, 4, 5

2.1 code

package org.rocky.learn.algorithm;
/**
 * Created by admin on 2018/1/10.
 */
public class ConvertArray {
    public static Integer[] convertTree(Integer[] from){
        int length = from.length;
        int height = (int) Math.ceil(log(length, 2));
        int should_size = (int) Math.pow(2, height)-1;
        Integer[] result = new Integer[should_size];
        result = copyArray(from, result);
        int index = 0;
        for(int i=0; i<height; i++){
            int size = (int) Math.pow(2, i);
            result = convertArray(result, index, size);
            index += size;
        }
        return result;
    }

    public static Integer[] copyArray(Integer[] from, Integer[] to){
        for(int i=0; i<Math.min(from.length, to.length); i++){
            to[i] = from[i];
        }
        return to;
    }

    public static double log(double value, double base){
        return Math.log(value)/Math.log(base);
    }
public static Integer[] convertArray(Integer[] from, int beginIndex, int size){
        int length = from.length;
        Integer[] to = new Integer[length];
        for (int i=0; i<length; i++){
            if(i<beginIndex || i>beginIndex+size-1)
                to[i] = from[i];
            else
                to[i] = from[beginIndex + size -1 -(i-beginIndex)];
        }
        return to;
    }

    public static void main(String[] args){
        Integer[] to = convertTree(new Integer[]{1,2,3,4,5,6});
       for(int i=0; i<to.length; i++){
           System.out.print(to[i]==null?"":to[i]);
           if(i<to.length-1)
               System.out.print(",");
       }
    }
}

2.2 更新

public static Integer[] convertArray(Integer[] array, int beginIndex, int size){
        int length = array.length;
        if(beginIndex >=0 && beginIndex <= length-1){
            int endIndex = beginIndex+size > length ? length : beginIndex + size;
            for(int i=beginIndex; i<(endIndex+beginIndex)/2; i++){
                int index = endIndex-1-(i-beginIndex);
                Integer temp = array[i];
                array[i] = array[index];
                array[index] = temp;
            }
        }
        return  array;
    }

 

3. 总结

写出来的速度反应编程能力, fighting!

posted @ 2018-01-10 17:29  fangfan  阅读(242)  评论(0编辑  收藏  举报