一道google的面试题(据说)
2024-08-22 03:36:09
1. 原题(同事给的)
Max Howell 参加了谷歌的面试,出题人竟然要求 Max Howell 在白板上作出解答,Max Howell 当然愤怒地拒绝了,回家以后马上在微博上跟我们分享他的吐槽: Google: % 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 系统会不会更方便一些呢? 假如有这样一个二叉树, / \ / \ / \ / \ / 使用广度优先的原则用数组的表示就是 [, , , , , , , , , , null, null, null, null, null],二叉树中的空位用 null 表示。 进行反转以后会变成 / \ / \ / \ \ / \ 使用广度优先的原则用数组的表示就是 [, , , , , , , null, null, null, null, null, , , ]。 请实现函数 invertTree,它接受一个表示二叉树的数组,返回表示这个反转二叉树的数组。 请注意,提交后提示中显示的 ,,,,,, 表示的是 , , , null, null, , 。
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!
最新文章
- 使用ExpandoObject来实现多个Model传送至视图
- easyui datagrid 键盘上下控制选中行
- linux 文件删除原理
- TCP/IP 小知识
- Java学习笔记之接口
- [转]省市二级联动(纯js实现)
- LINUX怎么修改IP地址
- Piggy-Bank(完全背包)
- python中如何判断list中是否包含某个元素
- javascript封装的函数
- (转)Synchronized(对象锁)和Static Synchronized(类锁)的区别
- Android 开发笔记___Application操作全局变量
- freemarker之list遍历(八)
- 新概念英语(1-31)Where&#39;s Sally?
- c/c++ linux 进程间通信系列6,使用消息队列(message queue)
- K好数(DP)
- Docker容器 暴露多个端口
- Redis单机安装
- 托管博客到coding或者github
- 如何加固linux NFS 服务安全的方法
热门文章
- Django 学习资源
- uC/OS-II 函数之OSInit()
- 在iOS7中修改键盘Return键的类型
- Flink学习笔记:Operators串烧
- 手动博客重定向 https://www.cnblogs.com/kelthuzadx/
- python简介和环境搭建
- __getitem__
- 干掉Vivado幺蛾子(1)-- Xilinx Tcl Store
- 进阶篇:4.4)DFA设计指南:面向高速自动化装配设计
- 第七次 Scrum Meeting