题目

阅读下列说明,根据要求,完成以下题目

【说明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)
            {
   
        
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值