当前位置: 首页 > wzjs >正文

网站 筛选功能深圳 网站开发

网站 筛选功能,深圳 网站开发,淘宝网站优化实例,网站新建网页292. Nim 游戏 - 力扣(LeetCode) 想法 枚举问题: n 1 ~ 3 ,由于我先手,我可以直接拿走全部的石头,所以我赢n 4,由于我先手,我拿掉 1 - 3 块石头 ,剩下的可能就是 1 -…

292. Nim 游戏 - 力扣(LeetCode)

想法

枚举问题:

  • n = 1 ~ 3 ,由于我先手,我可以直接拿走全部的石头,所以我赢
  • n = 4,由于我先手,我拿掉 1 - 3 块石头 ,剩下的可能就是 1 - 3 块石头,他可以拿掉全部石头,所以他赢
  • n = 5,假设都是在最优的情况下,我拿掉 1 块石头,他最多只能拿 1 - 3 块,不管他拿多少,剩下的我都能拿到

这个游戏的问题就类似于斐波那契数列,我的最优答案可以从前三个里面获取,由于我先手,只要他不赢那就是我赢

// (n - 1) && (n -2) && (n -3):这些是 n - 1,n - 2,n - 3 只剩这些石头,出手会不会赢
// &&:我当然不会让他赢啦,只要有一个能让他输,我就拿多少石头
// !:((n - 1) && (n -2) && (n -3)) 用来判断他是否会赢,如果他赢不了,那就是我赢
// 这一整条都是用来计算我出手会不会赢
n = !((n - 1) && (n -2) && (n -3))

解决

我用了 boolean 数组,只保存前 3 个石头的答案,但是遇到像 1348820612 这种,就需要运算 1348820612 次循环,导致超出时间限制

/*** 超出时间限制问题,已通过 50 个测试用例* @param n 石头数量* @return 我是否能够获胜*/
public boolean canWinNim(int n) {// 我先出手,所以我直接赢了if (n == 1 || n == 2 || n == 3) {return true;}// 用来保存,前 3 个石头出手能获胜的概率boolean[] result = new boolean[3];// 只剩 1 - 3 个石头时,谁出手谁获胜result[0] = result[1] = result[2] = true;int index = 3;while(index < n){// (n - 1) && (n -2) && (n -3):这些是 n - 1,n - 2,n - 3 只剩这些石头,出手会不会赢// &&:我当然不会让他赢啦,只要有一个能让他输,我就拿多少石头// !:((n - 1) && (n -2) && (n -3)) 用来判断他是否会赢,如果他赢不了,那就是我赢// 这一整条都是用来计算我出手会不会赢boolean flag = !(result[0] && result[1] && result[2]);move(result, flag);index++;}// 最后一个就是答案了return result[2];
}/*** 将答案往前移动*/
public void move(boolean[] flags, boolean flag){flags[0] = flags[1];flags[1] = flags[2];flags[2] = flag;
}

第一次优化

这里我使用了位运算,但是还是超时限制了,不过比前面多运行成功二个例子

/*** 优化版本,使用位运算* 超出时间限制问题,已通过 52 个测试用例* @param n 石头数量* @return 我是否能够获胜*/
public boolean canWinNim(int n) {// 我先出手,所以我直接赢了if (n == 1 || n == 2 || n == 3) {return true;}// 代表到谁拿石头的输赢情况 0:代表输,1:代表赢// 二进制 0000 0111byte result = 0b111;// 赢的情况byte sureWin = 0b111;int index = 3;while(index < n){// & 运算:只有两位都是 1,结果才是 1// result & sureWin:用来判断他是否会赢,要是前面都是下一个人赢,那么我怎么拿都是输// (result & sureWin) == sureWin:也就是说 右边三位都是 1boolean myWin = !((result & sureWin) == sureWin);// 将所有位 左移动一位// 例如:result = 0000 0111,左移动一位,result = 0000 1110result <<= 1;// 如果赢了,就需要给最右边位改为 1if (myWin){result |= 1;}index++;}// 最后位是 1,代表我赢,是 0,代表我输return (result & 1) == 1;
}

第二次优化

思来想去,找不到好的优化方式,最后通过前面编写的方法,以找规律的方式尝试,发现只要 n % 4 ==0 就是我输

public boolean canWinNim(int n) {return n % 4 != 0;
}

http://www.dtcms.com/wzjs/548525.html

相关文章:

  • 网站上线前营销推广工作准备实训网站建设的心得总结
  • 网站开发开题报告计划进度安排电子宣传册如何制作
  • 沈阳制作网站企业粉丝社区网站怎么做
  • 把网站传到服务器上怎么做网站设计与网页制作项目教程
  • access做网站数据库能有多大容量微信公众号app下载安装
  • 韩国设计公司网站大岭山仿做网站
  • 哪个网站做视频挣钱wordpress 读书主题
  • 秋林 做网站网页版游戏排行榜j
  • html购物网站wordpress寺院模板
  • 网站最佳颜色搭配广州注册公司需要什么条件
  • 雄安网站建设机构网站建设进度说明
  • 河北城乡建设学校网站室内装饰装修资质证书
  • 阿里云 iis 多个网站免费分销系统
  • jsp网站开发书籍推荐昌都市网站建设
  • 做门户网站服务器选择广东做网站
  • 网站开发哪家好网站 对比
  • 某企业网站建设规划书wordpress 图片 自动重命名
  • 兰州市城乡建设厅网站为什么只有中国做网站需要备案
  • 建设设计公司网站专门做自助游的网站
  • 聊城集团网站建设价格什么设计网站好
  • 商务网站建设实训报告营销型网站建设的指导原则不包括
  • 订货网站建设上海做网络口碑优化的公司
  • 静态网站特点做珠宝首饰网站
  • 做微信推送网站网站图片什么格式
  • 工程行业网站建一个网站的流程
  • 网站建设客户调查需求表网页大图素材
  • 网站底部版权怎么做网站地图定位怎么做
  • 网站优化 前端怎么做品牌建设经验做法
  • 织梦网站调整门户网站 流量
  • 禹城网站建设费用编程应用