分类 编程技术 下的文章

印象深刻的笔试题:分解任意整数以质因子相乘的形式

刚毕业时,第一次参加招聘面试的笔试,一道编程题:分解一个整数以质因子相乘的形式,如24=2x2x2x3,100=2x2x5x5。(在纸上手写代码)
我的核心代码:Java Code

public static String resolve(int value) {
    String str = "";
    int temp = value;
    for (int i = 2; i <= Math.sqrt(value);) {
        if (temp % i == 0) {
            temp /= i;
            str += i + "x";
            continue;
        }
        i++;
    }
    return str.substring(0, str.length() - 1);
}

记得当时面试官提了好多次疑问,这样真的可以实现吗?让我有点无语,我也给解释了半天,不过我走之前好像还是没想清楚,所以让我印象深刻。

MsgPack编码/解码Array与Map的需要注意的问题(语言:Lua)

场景:
在我们游戏逻辑中,游戏数据均保存在Redis中,基本逻辑均在Redis内部使用Lua Script编写,并返回给外部程序相应数据。在数据传递过程中,使用了MsgPack数据格式传递比较复杂的数据结构。

功能:
统计玩家角色拥有各种装备数量

预想:
返回数据的格式,预想的是返回map,key:装备原型ID(number),value:拥有数量(number),将此map进行MsgPack编码后返回给外部程序。

问题:
在某些情况下,外部程序始终不能正确解码出返回的MsgPack格式数据。

分析结果:
由于我们静态数据中装备原型ID是从1开始,那么当玩家角色拥有装备的原型ID刚好是从1开始而有序的时候(Lua中均是table类型表示Array和Map,Array索引从1开始),MsgPack编码是就会把此种情况的数据当作是Array来编码,那么外部程序需要解码成Map就会不成功,除此之外的问题均无问题。

可选方案:

  • 装备原型ID不要从1开始
  • 返回的map的key不要是number类型,使用string类型,再由外部程序解码出来后转成需要的number类型(极不推荐)
  • 想办法换种传出数据的组合格式,让MsgPack编码时,不论何种情况均解析成Array或者Map

我的方案:固定以一个length为2的Array传出数据,元素类型:MsgPack格式的string。

  • 元素1:装备原型ID数组的MsgPack编码
  • 元素2:各具体数量数组的MsgPack编码