刚刚腾讯模拟题编程题,二分查找有问题

第一种解法:
package com;
import java.util.*;
/**
 * 满足三个节点值不在同一边可以了,root>min  root<max 
 * @author Admin
 *
 */

public class Main {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int k = in.nextInt();
		int a = in.nextInt();
		int b = in.nextInt();
		int c = in.nextInt();		
		int max = Math.max(a, Math.max(b,c));
		int min = Math.min(a, Math.min(b,c));
		int root = getMinRoot(k);
		//如果最小根节点root>max表示max在root左边
		while(max<root){
			k--;
			root -= getMinRoot(k);			
		}
		while(min>root){
			k--;
			root += getMinRoot(k);
		}
		System.out.println(root);
	}
	private static int getMinRoot(int k){
		//取中间节点作为比较的根节点
		int root = (int)(Math.pow(2,k)/2);
		return root;
	}
}

第二种解法:二分查找
package com;
import java.util.*;

public class Main01 {

	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int k = in.nextInt();
		int a = in.nextInt();
		int b = in.nextInt();
		int c = in.nextInt();
	
		int max = Math.max(a, Math.max(b,c));
		int min = Math.max(a, Math.min(b,c));
		int high = (int)(Math.pow(2,k)-1);
		int low = 1;
		while(low<high){
			int middle = (low+high)/2;
			if(middle>=min&&middle<=max){
				System.out.println(middle);
				break;
			}else if(middle>max){
				high=middle-1;
			}else{
				low=middle+1;
			}
		}
	}
}

但是第二种解法,测试用例有问题: 

全部评论
点赞 回复 分享
发布于 2017-08-29 23:39
腾讯不让切出去用自己的编译器,5秒登出算作弊  - - !   做个题各种闹心
点赞 回复 分享
发布于 2017-08-30 00:15
你二分查找的代码有笔误,min写成max了 int min = Math.**max**(a, Math.min(b,c));
点赞 回复 分享
发布于 2017-08-29 23:40
点赞 回复 分享
发布于 2017-08-29 23:36
没看到题,可以贴一下吗
点赞 回复 分享
发布于 2017-08-29 23:31
跪求大佬们解答,无声感激
点赞 回复 分享
发布于 2017-08-29 23:21

相关推荐

xwqlikepsl:感觉很厉害啊,慢慢找
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务