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

3211、生成不含相邻零的二进制字符串-cangjie

题目

3211、生成不含相邻零的二进制字符串

思路

dfs

代码

class Solution {let numRune = [r'0', r'1']func dfs(arr: ArrayList<Rune>, ans: ArrayList<String>,n: Int64):Unit{if(arr.size >= n){ans.insert(0, String(arr))// println("insert ${String(arr)}")return}// println("String(arr) = ${String(arr)}")for(i in 0..=1){// println("for i = ${i}")if(i == 0 && arr[arr.size-1] == r'0'){// println("continue")continue}var tmparr = ArrayList<Rune>(arr)tmparr.insert(arr.size, numRune[i])// println("String(tmparr) before dfs = ${String(tmparr)}")dfs(tmparr, ans, n)// println("String(tmparr) after dfs = ${String(tmparr)}")}// println("return")}func validStrings(n: Int64): ArrayList<String> {var ans = ArrayList<String>()for(i in 0..=1){var arr = ArrayList<Rune>()arr.insert(arr.size, numRune[i])dfs(arr, ans, n)}return ans}
}

复杂度

时间复杂度:O(sizeof(ans))
每个字符位置有0和1两种选择的话是O(2^n),但是由于做的剪枝,所以相对于全访问,复杂度降低

if(i == 0 && arr[arr.size-1] == r'0'){// println("continue")continue}

空间复杂度:O(n^2)
最深最多保存n个size in 1..narr

遇到的坑

1、深浅拷贝问题

var tmparr = ArrayList<Rune>(arr)

如果这一行使用

var tmparr = arr

则在后续修改tmparr的时候,因为是浅拷贝(引用拷贝),因此会直接修改到arr,导致程序出错
n=3时
var tmparr = arr结果

String(arr) = 0
for i = 0
continue
for i = 1
String(tmparr) before dfs = 01
String(arr) = 01
for i = 0
String(tmparr) before dfs = 010
insert 010
String(tmparr) after dfs = 010
for i = 1
String(tmparr) before dfs = 0101
insert 0101
String(tmparr) after dfs = 0101
return
String(tmparr) after dfs = 0101
return
String(arr) = 1
for i = 0
String(tmparr) before dfs = 10
String(arr) = 10
for i = 0
continue
for i = 1
String(tmparr) before dfs = 101
insert 101
String(tmparr) after dfs = 101
return
String(tmparr) after dfs = 101
for i = 1
String(tmparr) before dfs = 1011
insert 1011
String(tmparr) after dfs = 1011
return

var tmparr = ArrayList(arr)结果

String(arr) = 0
for i = 0
continue
for i = 1
String(tmparr) before dfs = 01
String(arr) = 01
for i = 0
String(tmparr) before dfs = 010
insert 010
String(tmparr) after dfs = 010
for i = 1
String(tmparr) before dfs = 011
insert 011
String(tmparr) after dfs = 011
return
String(tmparr) after dfs = 01
return
String(arr) = 1
for i = 0
String(tmparr) before dfs = 10
String(arr) = 10
for i = 0
continue
for i = 1
String(tmparr) before dfs = 101
insert 101
String(tmparr) after dfs = 101
return
String(tmparr) after dfs = 10
for i = 1
String(tmparr) before dfs = 11
String(arr) = 11
for i = 0
String(tmparr) before dfs = 110
insert 110
String(tmparr) after dfs = 110
for i = 1
String(tmparr) before dfs = 111
insert 111
String(tmparr) after dfs = 111
return
String(tmparr) after dfs = 11
return

2、ArrayList 的 insert 位置问题
如果是顺序不敏感的ans,就可以直接在 0 位置插入 String(arr),但是如果是对顺序敏感的arr,则需要插入到队尾,即arr.size,注意不是size-1,相当于end()迭代器的位置
3、Rune(i)使用问题
在一开始写的时候,我尝试过
···cangjie
arr.insert(arr.size, Rune(i))
···
这样会导致乱码

最后还是

let numRune = [r'0', r'1']
arr.insert(arr.size, numRune[I])

结果

cangjie

http://www.lryc.cn/news/471661.html

相关文章:

  • 【wpf】wpf程序联合控制台测试
  • 使用 Spring Doc 为 Spring REST API 生成 OpenAPI 3.0 文档
  • ssm基于ssm框架的滁艺咖啡在线销售系统+vue
  • 微信小程序 - 动画(Animation)执行过程 / 实现过程 / 实现方式
  • 【Linux】nohup 命令
  • CSS、Less、Scss
  • [笔记] ffmpeg docker编译环境搭建
  • 基于SSM的心理咨询管理管理系统(含源码+sql+视频导入教程+文档+PPT)
  • 南开大学《2023年+2022年810自动控制原理真题》 (完整版)
  • 【算法】Kruskal最小生成树算法
  • Pocket通常指的是一种特定的凹形或凹槽
  • Cesium基础-(Entity)-(Billboard)
  • 从0到1,解读安卓ASO优化!
  • go语言中流程控制语句
  • k8s 部署 emqx
  • CSS.导入方式
  • Linux之nfs服务器和dns服务器
  • 大模型系列——AlphaZero/强化学习/MCTS
  • 原生js实现拖拽上传(拖拽时高亮上传区域)
  • python道格拉斯算法的实现
  • STM32的hal库中,后缀带ex和不带的有什么区别
  • 可观测性三大支柱
  • 【银河麒麟高级服务器操作系统·实例分享】裸金属服务器开机失败分析及处理建议
  • 模型剪枝实操
  • 网安学习路线!最详细没有之一!看了这么多分享网安学习路线的一个详细的都没有!
  • Ubuntu18.04安装vscode1.94.2失败安装vscode1.84.2
  • Redis中Lua脚本的使用场景
  • 重工业数字化转型创新实践:某国家特大型钢铁企业如何快速落地基于实时数仓的数据分析平台
  • 【linux】手动启动sshd
  • 前端项目【本科期间】