阅读下列说明,根据要求,完成以下题目
【说明1】
Protocol Buffers(简称protobuf)是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等。
在游戏开发中经常使用它作为服务器-客户端,服务器-服务器之间的通讯协议,以及数据库中的二进制存储格式。
其中用到了一种Varint(Variable length integers)编码,它是一种对数字进行编码的方法,编码后二进制数据是不定长的,数值越小的数字使用的字节数越少。
官方文档中的说明:
【问题一】
根据以上,写出
十进制的666(2Bytes)的二进制形式为 ____________ , Varint编码后的二进制形式为 ____________
十进制的888(2Bytes)的二进制形式为 ____________ , Varint编码后的二进制形式为 ____________
【说明2】
负数问题:因为负数必须在最高位(符号位)置 1,这一点意味着无论如何,负数都必须占用所有字节,导致Varint编码对负数编码效率低
为解决这个问题,protobuf 为我们提供了 sint32、sint64 两种类型,当你在使用这两种类型定义字段时,protobuf 将使用 ZigZag 编码,而 ZigZag 编码将解决负数编码效率低的问题(先使用ZigZag编码将有符号整数映射到无符号整数,然后再使用 Varint 编码)
关于ZigZag编码:
正数
假设数据类型为byte的正数11,其二进制表示为: 00001011
数据左移一位: 00010110
符号位(正数的符号为0)放到最后一位: 00010110
负数
假设数据类型为byte的负数-11,其二进制在计算机中是用补码表示的,计算过程如下
正数原码: 00001011
反码: 11110100
补码(反码加1): 11110101
处理过程:
左移一位: 11101010
符号位放到最后一位: 11101011
除最后一位外全部取反: 00010101
【问题二】
现在你有6个经过ZigZag编码后的值(以16进制形式给出),请编写代码将他们还原并逐行输出
6个值为:0x268cb43,0x7ff,0x2b7b,0x123a,0xf6,0x282
要求:
编写代码对以上6个值进行解码还原 (注意:6个值为固定值,无需动态读入)
将解码后的值以10进制形式输出,每行对应一个解码后的值
支持C/C++, C#, Java, JavaScript, Python编程语言
源代码以附件的形式提交,限提交单个文件
二进制
666:1010011010
888:1101111000
varint:
666:1001101000000101
888:1111100000000110
using System;
namespace ConsoleApp3
{
class Program
{
static int[] HexNum = {
0x268cb43, 0x7ff, 0x2b7b, 0x123a, 0xf6, 0x282};
static void Main(string[] args)
{
foreach (int nNum in HexNum)
{
int nValue = Convert.ToInt32(nNum);
int nOut = (nValue >> 1) ^ -(nValue & 1);
Console.WriteLine(nOut);
}
}
}
}
【穿越峡谷】
魔法星球上有一所魔法学校,但是魔法学校被一个峡谷环绕,学生们每天都要穿过这个峡谷去上学.
峡谷深不见底,好在峡谷上每天会随机产生一些魔法桥,魔法桥由传送法阵相连,相邻法阵的距离相等,为1个单位长度,第一个和最后一个魔法阵分别再峡谷两侧,即桥的两端.每个传送阵上的数字表示可以从该法阵到达的最远法阵的距离.
为了方便学员选择正确的桥通过,法阵上的数字会按顺序显示在桥的一侧,构成一个非负整数数组nums.请根据该数组nums判断,是否可以通过该桥到达峡谷对面的魔法学校.
注意:只要到达最后一个法阵就已经到达魔法学校所在的陆地上了,此时前往学校不受该魔法阵数字影响.
输入:一个非负整数数组nums
输出:一个布尔变量,true表示可以到达,false表示不可以到达
示例1:
输入:[2,3,1,1,4]
输出:true
解释:可以从第一法阵传1个单位距离,到达第二个法阵, 然后再从第二个法阵传3个单位距离到达最后一个法阵。
示例2:
输入:[3,2,1,0,4]
输出:false
解释:无论怎样,总会到达第四个法阵,但该法阵的最大传送距离为0,所以永远不可能到达最后一个法阵。
【问题一】
请以文字描述的方式写出你的解题思路:
【问题二】
请给出你的代码实现
要求:
编写代码从标准输入流中读取输入(输入以换行符结束),将结果输出到标准输出流
支持C/C++, C#, Java, JavaScript, Python编程语言
源代码以附件的形式提交,限提交单个文件
解题思路:
贪心算法,从第1位开始:每个位置都计算自己能达到的最远距离,同时每个位置要判断自己是否可达,
也就是本位置需要在当前最远能到达的距离中。最终计算出来能到达的最远距离,与数组长度比较即可。
using System;
namespace ConsoleApp3
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("输入数字数组(包含中括号):");
string strRead = Console.ReadLine().Trim();
string[] arrStrNum = null;
int[] arrIntNum = null;
bool bCanJump = false;
strRead = strRead.Substring(1, strRead.Length - 2);
arrStrNum = strRead.Split(",");
arrIntNum = new int[arrStrNum.Length];
for (int i = 0; i < arrStrNum.Length; i++)
{
arrIntNum[i] = Convert.ToInt32(arrStrNum[i]);
}
bCanJump = CanJump(arrIntNum);
Console.WriteLine(bCanJump.ToString().ToLower());
}
/*
解题思路:
贪心算法,从第1位开始:每个位置都计算自己能达到的最远距离,同时每个位置要判断自己是否可达,
也就是本位置需要在当前最远能到达的距离中。最终计算出来能到达的最远距离,与数组长度比较即可。
*/
static bool CanJump(int[] arrNum)
{
int nLen = arrNum.Length;
if (nLen == 1)
{