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!

最新文章

  1. 使用ExpandoObject来实现多个Model传送至视图
  2. easyui datagrid 键盘上下控制选中行
  3. linux 文件删除原理
  4. TCP/IP 小知识
  5. Java学习笔记之接口
  6. [转]省市二级联动(纯js实现)
  7. LINUX怎么修改IP地址
  8. Piggy-Bank(完全背包)
  9. python中如何判断list中是否包含某个元素
  10. javascript封装的函数
  11. (转)Synchronized(对象锁)和Static Synchronized(类锁)的区别
  12. Android 开发笔记___Application操作全局变量
  13. freemarker之list遍历(八)
  14. 新概念英语(1-31)Where&#39;s Sally?
  15. c/c++ linux 进程间通信系列6,使用消息队列(message queue)
  16. K好数(DP)
  17. Docker容器 暴露多个端口
  18. Redis单机安装
  19. 托管博客到coding或者github
  20. 如何加固linux NFS 服务安全的方法

热门文章

  1. Django 学习资源
  2. uC/OS-II 函数之OSInit()
  3. 在iOS7中修改键盘Return键的类型
  4. Flink学习笔记:Operators串烧
  5. 手动博客重定向 https://www.cnblogs.com/kelthuzadx/
  6. python简介和环境搭建
  7. __getitem__
  8. 干掉Vivado幺蛾子(1)-- Xilinx Tcl Store
  9. 进阶篇:4.4)DFA设计指南:面向高速自动化装配设计
  10. 第七次 Scrum Meeting