您的位置:首页 > 其它

geohash编码 (腾讯2017校招开发工程师试卷一)

2017-08-18 17:41 232 查看
题目

分析

代码

题目

geohash 编码: geohash 常用于将二维的经纬度转换为字符串,分为两步:第一步是经纬度的二进制编码,第二部是 base32 转码。

此题考察唯独的二进制编码:算法对维度 [-90,90] 通过二分法进行无限逼近(取决于所需精度,本题精度为 6 )。注意,本题进行二分法逼近过程中只采用向下取整来进行二分,针对二分中间值属于右区间。

算法举例如下:

(1) 区间 [-90,90] 进行二分为 [-90,0),[0,90] ,成为左右区间,可以确定 80 为右区间,标记为 1 ;

(2) 针对上一步的右区间 [0,90] 进行二分为 [0,45),[45,90] ,可以确定 80 是右区间,标记为 1 ;

(3) 针对 [45,90] 进行二分为 [45,67),[67,90] ,可以确定 80 为右区间,标记为 1 ;

(4) 针对 [67,90] 进行二分为 [67,78),[78,90] ,可以确定 80 位右区间,标记为 1 ;

(5) 针对 [78,90] 进行二分为 [89,84),[84,90] ,可以确定 80 位左区间,标记为 0 ;

(6) 针对 [78,84) 进行二分为 [78,81),[81,84) ,可以确定 80 位左区间,标记为 0 ;

已达精度要求,编码为 111100

样本输入: 80

样本输出: 111100

分析

这道题目其实是一个折半查找(二分查找)类型的题目, 区别在于, low 和 high在这里初始设定为 low = -90 high=90

代码



import java.util.Scanner;

public class Main {
static int count = 0;

public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
binarySearch(n);
}

public static void binarySearch(int n){
int low=-90, high=90, mid;
while(low <= high){
mid = (high + low)/2;
if(n >= mid){
System.out.print(1);
low = mid;
count++;
}else{
System.out.print(0);
high = mid;
count++;
}

if(count == 6)
break;
}
}
}


输入:

80


输出:

111100
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: