内容会持续更新,有错误的地方欢迎指正,谢谢!
问题
geohash编码:geohash常用于将二维的经纬度转换为字符串,分为两步:第一步是经纬度的二进制编码,第二步是base32转码。
此题考察纬度的二进制编码:算法对纬度[-90, 90]通过二分法进行无限逼近(取决于所需精度,本题精度为6)。注意,本题进行二分法逼近过程中只采用向下取整来进行二分,针对二分中间值属于右区间。算法举例如下: 针对纬度为80进行二进制编码过程:
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]进行二分为[78, 84),[84, 90],可以确定80为左区间,标记为0;
6) 针对[78, 84)进行二分为[78, 81), [81, 84),可以确定80为左区间,标记为0;
输入描述:
输入包括一个整数n,(-90 ≤ n ≤ 90)
输出描述:
输出二进制编码
输入例子:
80
输出例子:
111100
分析
二分法的简单应用
值在左区间记为0,在右区间记为1
由于精度为6,所以直接迭代6次即可。。
所用数据结构: vector
代码
#include <iostream>
#include <vector>
using namespace std;
void DividFunc(int num,int beginVal,int endVal)//迭代实现
{
int mid;
vector<int> res;
for(int i=0;i<6;++i)
{
mid=(beginVal+endVal+1)/2;//这里需要注意+1,你体会一下就知道啦~
if(num>=mid)
{
res.push_back(1);
beginVal=mid;
}
else
{
res.push_back(0);
endVal=mid-1;
}
}
for(int i=0;i<6;++i)
{
cout<<res[i];
}
cout<<endl;
}
int main()
{
int num;
while(cin>>num)
{
DividFunc(num,-90,90);
}
return 0;
}
总结:挺简单的一道题,看着题目信息量很大的题反而简单,排在后面的题一般也不难。所以,各位不要因为题的信息量大或排在后面而产生畏难心理!
该博客介绍了geohash编码在处理经纬度转换时的二进制编码方法,特别是针对纬度[-90, 90]的二分法逼近策略。通过一个80度纬度的示例详细解释了如何进行二进制编码,最终得出6位二进制编码。博客提到这是一个腾讯2017笔试题,并指出此类问题可以通过简单的二分法迭代6次来解决。"
128384366,16606204,Python+Vue学习类视频网站开发详解,"['Python开发', '前端开发', 'Vue框架', 'SSM框架', '数据库设计']

6698

被折叠的 条评论
为什么被折叠?



