剑指offer - 抽象建模能力

1.扑克牌顺子

问题描述:

LL 今天心情特别好,因为他去买了一副扑克牌,发现里面居然有 2 个大王,2 个小王(一副牌原本是 54 张_)...他随机从中抽出了 5 张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心 A,黑桃 3,小王,大王,方片 5”,“Oh My God!”不是顺子.....LL 不高兴了,他想了想,决定大\小 王可以看成任何数字,并且 A 看作 1,J 为 11,Q 为 12,K 为 13。上面的 5 张牌就可以变成“1,2,3,4,5”(大小王分别看作 2 和 4),“So Lucky!”。LL 决定去买体育彩票啦。 现在,要求你使用这幅牌模拟上面的过程,然后告诉我们 LL 的运气如何, 如果牌能组成顺子就输出 true,否则就输出 false。为了方便起见,你可以认为大小王是 0。

解题思路:

用一个 set 来存放数据,0 不要放进去,需要满足三个条件:

  • numbers 数组的长度为 5
  • numbers 数组除 0 外不能有重复的数
  • set 中最大的数与最小的数之差必须在 5 以内
function IsContinuous(numbers) {
  // write code here
  if (numbers.length != 5) {
    return false;
  }
  var num = 0; //记录0的个数
  var set = new Set();
  for (let i = 0; i < numbers.length; i++) {
    if (numbers[i] === 0) {
      num++;
    } else {
      set.add(numbers[i]);
    }
  }
  if (num + set.size != 5) {
    //有除0外的重复元素
    return false;
  }
  if (Math.max(...set) - Math.min(...set) < 5) {
    return true;
  }
  return false;
}

2.孩子们的游戏(圈中最后剩下的数)

问题描述:

每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF 作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数 m,让编号为 0 的小朋友开始报数。每次喊到 m-1 的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续 0...m-1 报数....这样下去....直到剩下最后一个小朋友,可以不用表演,并且拿到牛客名贵的“名侦探柯南”典藏版(名额有限哦!!_)。请你试着想下,哪个小朋友会得到这份礼品呢?(注:小朋友的编号是从 0 到 n-1)

如果没有小朋友,请返回-1

解题思路:

用一个数组装上小朋友,[ 0, 1, 2, 3, 4, 5 ],
从-1 开始计数,直到发现那个小朋友,将它出列,将它后面的小朋友放到队伍前,前面的放在后。重新计数。
如 m=4 3 出列 新队伍[ 4, 5, 0, 1, 2 ]

function LastRemaining_Solution(n, m) {
  // write code here
  if (n === 0 || m === 0) return -1;
  var i = 0;
  var arr = [];
  while (i < n) {
    arr.push(i++);
  }
  var count = -1;
  while (arr.length > 1) {
    for (let i = 0; i < m; i++) {
      count++;
      if (count == arr.length) {
        count = 0;
      }
    }
    arr = arr.slice(count + 1).concat(arr.slice(0, count));
    count = -1;
  }
  return arr[0];
}
posted @ 2020-04-17 23:46  木子呆头  阅读(123)  评论(0编辑  收藏  举报