博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【LeetCode】智商题 brainteaser(共3题)
阅读量:4653 次
发布时间:2019-06-09

本文共 1170 字,大约阅读时间需要 3 分钟。

【292】Nim Game 

 

【319】Bulb Switcher 

 

【777】Swap Adjacent in LR String (2019年2月13日,谷歌tag)

给了两个字符串start 和end,问通过如下两个规则能不能经过一定的变换,把start变成end。

规则1: "XL" -> "LX" 

规则2:"RX"->"XR"

题解:我一开始还以为贪心能解。结果==,举个例子 start = "XXXXXLXXXX" end = "LXXXXXXXXX",这样是能够变换过去的。

通过观察我们可以得到如下的结论:L只能往左移动,R只能往右移动,而且两个都是只能和X交换。所以。我们可以检查整个字符串除了X之外的所有字符LR,看start和end除了X之外的字符是不是相等。如果不是,那么肯定不能变换出来。

还有,因为L只能往左边移动,而且只能和X交换。那么我们start中的L如果它的下标位置比end中的L的下标位置小的话,这样肯定是不行的。同理R。

时间复杂度是O(N)

1 class Solution { 2 public: 3     bool canTransform(string start, string end) { 4         const int n = start.size(); 5         int p1 = 0, p2 = 0; 6         while (p1 < n && p2 < n) { 7             while (p1 < n && start[p1] == 'X') {++p1;} 8             while (p2 < n && end[p2] == 'X') {++p2;} 9             if (p1 == n && p2 == n) {
break;}10 if (p1 < n && p2 == n || p1 == n && p2 < n || start[p1] != end[p2]) {
return false;}11 if (start[p1] == 'L' && p1 < p2) {
return false;}12 if (start[p1] == 'R' && p1 > p2) {
return false;}13 ++p1, ++p2;14 }15 return true;16 }17 };
View Code

 

转载于:https://www.cnblogs.com/zhangwanying/p/9964669.html

你可能感兴趣的文章
防止SQL注入的登录页面
查看>>
生成和解析txt文件
查看>>
stm32F429启动时钟配置
查看>>
正则表达式移除首部尾部多余字符
查看>>
iOS截取视频缩略图的两种方法
查看>>
柯里化函数之Javascript
查看>>
WTL安装
查看>>
我的软考之路(四)——数据结构和算法(2)树和二叉树
查看>>
c语言发挥帕斯卡三角
查看>>
UIControl-IOS开发
查看>>
Chord算法(原理)
查看>>
扩展点(持续更新......)
查看>>
TortoiseSVN服务器ip地址修改后如何使用
查看>>
flex RemoteObject 的两种使用方法
查看>>
Oracle EBS R12多组织(多OU)访问架构
查看>>
小强的HTML5移动开发之路(2)——HTML5的新特性
查看>>
利用Delphi编写IE扩展
查看>>
chrome插件Vimium快捷键
查看>>
Spring Boot 注解
查看>>
自己常看的政评
查看>>