17、电话号码的字母组合-cangjie

题目

17、电话号码的字母组合

思路

  1. 输入处理

    • 接收一个字符串 digits,表示手机键盘上的数字,数字可以对应不同的字母组合。
  2. 边界检查

    • 如果输入字符串 digits 为空,返回一个空的结果列表。
  3. 按钮映射

    • 初始化一个二维数组 buttons,它将每个数字映射到相应的字母(如 2 对应 “abc”,3 对应 “def”,等)。
    • 使用一个计数器,将字母依次填充到对应数字的按钮数组中。
  4. 转换输入为字符数组

    • 将输入字符串 digits 转换为字符数组 digitsArr,便于后续处理。
  5. 递归深度优先搜索 (DFS)

    • 定义一个递归函数 dfs,用于生成字母组合。
    • 函数参数包含当前的数字数组、按钮映射、结果列表、当前字母组合以及当前数字索引。
  6. 生成组合

    • 检查当前的数字索引 digitIndex 是否已达到输入数字数组的大小。
    • 如果达到,表示已生成一个有效的字母组合,添加到结果列表中。
    • 如果未达到,则根据当前数字对应的按钮,循环每个字母,递归调用 DFS 函数,构建下一个字母组合。
  7. 返回结果

    • 一旦 DFS 完成所有递归调用,返回最终的字母组合列表 ans

这个程序的核心思路是利用递归逐层构建字母组合,直到遍历完所有数字的可能字母。通过使用回溯方法(DFS),实现了对于所有可行组合的探索和累积。

代码

class Solution {func dfs(digitsArr: Array<Rune>, buttons: ArrayList<ArrayList<Rune>>, ans: ArrayList<String>, str: ArrayList<Rune>, digitIndex: Int64):Unit{if(digitIndex == digitsArr.size){ans.append(String(str))return}// println(digitsArr[digitIndex])// println(UInt32(digitsArr[digitIndex]))// println("check buttons ${Int64(UInt32(digitsArr[digitIndex]) - UInt32(r'0') - 1)}")for(c in buttons[Int64(UInt32(digitsArr[digitIndex]) - UInt32(r'0') - 1)]){var newStr = ArrayList<Rune>(str)newStr.append(c)dfs(digitsArr, buttons,ans, newStr, digitIndex+1)}}func letterCombinations(digits: String): ArrayList<String> {if(digits.size == 0){return ArrayList<String>()}var buttons = ArrayList<ArrayList<Rune>>()let cInButton = [0,3,3,3,3,3,4,3,4]var cnt:UInt32 = 0for(i in 0..9){var button = ArrayList<Rune>()for(j in 0..cInButton[i]){button.append(Rune(UInt32(r'a')+cnt))// println("char ${Rune(UInt32(r'a')+cnt)} is append to button ${i+1}")cnt++}buttons.append(button)// println()}// for(button in buttons){//     println("1")//     println(String(button))// }let digitsArr = digits.toRuneArray()var ans = ArrayList<String>()// println("start dfs")dfs(digitsArr, buttons, ans, ArrayList<Rune>(), 0)// println()return ans}
}

复杂度

时间复杂度:O(4^n) (其中 n 是输入字符串的长度)

空间复杂度:O(n) (用于递归栈和存储结果)

遇到的坑

1、array初始化问题
一开始想着直接写死
在这里插入图片描述

class Solution {func letterCombinations(digits: String): ArrayList<String> {let teles = [[],[r'a', r'b', r'c'],[r'd', r'e', r'f'],[r'g', r'h', r'i'],[r'i', r'k', r'l'],[r'm', r'n', r'o'],[r'p', r'q', r'r', r's'],[r't', r'u', r'v'],[r'w', r'x', r'y', r'z']]for(tele in teles){println(String(tele))}return ArrayList<String>()}
}

报错

error: array literal type cannot be inferred==> solution.cj:3:22:|3 |         let teles = [[],[r'a', r'b', r'c'],[r'd', r'e', r'f'],[r'g', r'h', r'i'],[r'i', r'k', r'l'],[r'm', r'n', r'o'],[r'p', r'q', r'r', r's'],[r't', r'u', r'v'],[r'w', r'x', r'y', r'z']]|                      ^|

想着把类型写上去

class Solution {func letterCombinations(digits: String): ArrayList<String> {let teles = Array<Array<Rune>>[[],[r'a', r'b', r'c'],[r'd', r'e', r'f'],[r'g', r'h', r'i'],[r'i', r'k', r'l'],[r'm', r'n', r'o'],[r'p', r'q', r'r', r's'],[r't', r'u', r'v'],[r'w', r'x', r'y', r'z']]for(tele in teles){println(String(tele))}return ArrayList<String>()}
}

报错

error: extra arguments given for parameter list '(Int64, (Int64) -> Generics-T)' in call==> solution.cj:3:39:|3 |         let teles = Array<Array<Rune>>((),(r'a', r'b', r'c'),(r'd', r'e', r'f'),(r'g', r'h', r'i'),(r'i', r'k', r'l'),(r'm', r'n', r'o'),(r'p', r'q', r'r', r's'),(r't', r'u', r'v'),(r'w', r'x', r'y', r'z'))|                                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected 2 arguments, found 9|
note: found candidate==> (package std.core)array.cj:40:12:

按个赋值

class Solution {func letterCombinations(digits: String): ArrayList<String> {var teles = Array<Array<Rune>>(10, item: Array<Rune>(4, item: r'0'))for(i in 0..10){for(j in 0..4){print(teles[i][j])}println()}teles[2][0] = r'a'teles[2][1] = r'b'teles[2][2] = r'c'teles[3][0] = r'd'teles[3][1] = r'e'teles[3][2] = r'f'teles[4][0] = r'g'teles[4][1] = r'h'teles[4][2] = r'i'teles[5][0] = r'j'teles[5][1] = r'k'teles[5][2] = r'l'teles[6][0] = r'm'teles[6][1] = r'n'teles[6][2] = r'o'teles[7][0] = r'p'teles[7][1] = r'q'teles[7][2] = r'r'teles[7][3] = r's'teles[8][0] = r't'teles[8][1] = r'u'teles[8][2] = r'v'teles[9][0] = r'w'teles[9][1] = r'x'teles[9][2] = r'y'teles[9][3] = r'z'// for(tele in teles){//     println(String(tele))// }for(i in 0..10){for(j in 0..4){print(teles[i][j])}println()}return ArrayList<String>()}
}

倒是没报错,但是跑出来不对
在这里插入图片描述
目测是var teles = Array<Array<Rune>>(10, item: Array<Rune>(4, item: r'0'))Array<Rune>(4, item: r'0')指向的是同一个引用,导致所有的array都变成了最后一次修改的结果
目前是放弃了array,已老实用ArrayList
2、试了下append©,比insert(size, c)好用多了

结果

cangjie

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/2359.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

ZYNQ: AXI DMA 环路测试

环境 vivado 2022 vitis 2022 简介 DMA&#xff0c;即Direct Memory Access&#xff0c;指直接存储器访问。这是一种内存访问技术&#xff0c;允许某些计算机内部的硬件子系统&#xff08;如计算机外设&#xff09;独立地直接读写系统内存&#xff0c;而无需中央处理器&…

动态规划 01背包(算法)

现有四个物品&#xff0c;小偷的背包容量为8&#xff0c;怎么可以偷得价值较多的物品 如: 物品编号&#xff1a; 1 2 3 4 物品容量&#xff1a; 2 3 4 5 物品价值&#xff1a; 3 4 5 8 记f(k,w) ,当背包容量为w,可以偷k件物品…

端到端自动驾驶模型SparseDrive论文阅读笔记

为了进一步的理解模型&#xff0c;方便对模型进行调试&#xff0c;对论文进行了详细的阅读&#xff0c;记录了相关的笔记&#xff0c;和论文阅读批注。 论文阅读批注连接&#xff1a; https://note.youdao.com/s/VC6mDgdZ 笔记如下图&#xff1a;

SAP ABAP开发学习——BAPI

目录 业务对象 概念 ​编辑业务对象浏览 BAPI BAPI的浏览 BAPI的调用 BAPI的确认和返回 BAPI的创建 MM/SD常用BAPI 附加&#xff1a;长文本修改 业务对象 概念 业务对象浏览 进入SWO3查看 双击BUS2012 双击下图上方红色位置可以看到BAPI方法的内容 BAPI BAPI(Busines…

【网络】自定义协议——序列化和反序列化

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;了解什么是序列化和分序列&#xff0c;并且自己能手撕网络版的计算器。 > 毒鸡汤&#xff1a;有些事情&#xff0c;总是不明白&#xff0c;所以我不…

linux 原子操作

首先是为什么要有 原子操作 网上的截图&#xff1a; 不能从C语言来看&#xff0c;要从汇编来看 但是实际的情况有可能是这样。 A进程没有得到想要的结果。 然后是 原子操作的 底层实现 最终会是这段代码&#xff0c;当然只是一个 加一的操作。 static inline void atomic_a…

[MySQL]DQL语句(二)

(一)里面我们以单表查询为基础&#xff0c;讲了DQL语句的基础&#xff0c;这篇我们来讲多表查询。 联合查询 联合查询的作用是合并结果集&#xff0c;也就是把两个select语句的查询结果合并到一起。合并结果集的方式有两种&#xff0c;分别是去重和不去重。语法格式为: SELEC…

2-143 基于matlab-GUI的脉冲响应不变法实现音频滤波功能

基于matlab-GUI的脉冲响应不变法实现音频滤波功能&#xff0c;输入加噪信号&#xff0c;通过巴特沃斯模拟滤波器脉冲响应不变法进行降噪。效果较好。程序已调通&#xff0c;可直接运行。 下载源程序请点链接&#xff1a;2-143 基于matlab-GUI的脉冲响应不变法实现音频滤波功能…

初学者如何对大模型进行微调?

粗略地说&#xff0c;大模型训练有四个主要阶段&#xff1a;预训练、有监督微调、奖励建模、强化学习。 预训练消耗的时间占据了整个训练pipeline的99%&#xff0c;其他三个阶段是微调阶段&#xff0c;更多地遵循少量 GPU 和数小时或数天的路线。预训练对于算力和数据的要求非…

MySQL—基础学习

对于数据库MySQL的基础学习与Datagrip的使用 1.MySQL概述 &#xff08;1&#xff09;相关概念 数据库 &#xff1a;存储数据的仓库 &#xff08;DB&#xff09; 数据库管理系统&#xff1a;操控和管理数据库的大型软件&#xff08;DBMS&#xff09; SQL&#xff1a;操作关系…

客户案例 | 智原科技利用Ansys多物理场分析增强3D-IC设计服务

Ansys经过认证的半导体解决方案将帮助智原科技缩短2.5D/3D-IC的设计周期&#xff0c;并确保设计符合信号完整性和性能目标 主要亮点 智原科技将使用Ansys RaptorX™片上电磁&#xff08;EM&#xff09;建模解决方案来增强2.5D/3D集成电路&#xff08;IC&#xff09;的先进封装设…

集成框架 -- 自定义二方包 starter

自定义starter 二方包 My-thread-pool-startermy-thread-pool-starter 整体架构 测试 MyTestAppApplication测试工程 my-test-app 结构测试项目的 pom.xml 二方包 My-thread-pool-starter POM 文件 <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi&…

Spring框架的JDBC模板技术

目录 一、JDBC模板类的使用 1.引入依赖 2.测试类 3.运行&#xff0c;查看数据库 二、使用Spring框架来管理模板类 1.配置文件 2.测试类 3.运行&#xff0c;查看数据库 三、Spring框架管理开源的连接池 1.配置开源的连接池 2.将数据库连接的信息配置到属性文件中 3.核…

头歌答案-分布式文件系统HDFS

目录 第1关&#xff1a;HDFS的基本操作 第2关&#xff1a;HDFS-JAVA接口之读取文件 第3关&#xff1a;HDFS-JAVA接口之上传文件 第4关&#xff1a;HDFS-JAVA接口之删除文件 第1关&#xff1a;HDFS的基本操作 # 1. 启动Hadoop start-all.sh # 启动Hadoop集群 # 或使用以…

mysql设置允许外部ip访问,局域网IP访问

&#xff08;支持MYSQL8版本&#xff09; 1. 登录进入mysql&#xff1b;mysql -uroot -p输入密码进入 2. 输入以下语句&#xff0c;进入mysql库&#xff0c;查看user表中root用户的访问 use mysql; select host,user from user; 3. 更新user表中root用户域属性&#xff0c…

深度学习基础(2024-11-02更新到图像尺寸变换 与 裁剪)

1. 名词解释 FFN FFN &#xff1a; Feedforward Neural Network&#xff0c;前馈神经网络馈神经网络是一种基本的神经网络架构&#xff0c;也称为多层感知器&#xff08;Multilayer Perceptron&#xff0c;MLP&#xff09;FFN 一般主要是包括多个全连接层(FC)的网络&#xff…

Python | Leetcode Python题解之第526题优美的排列

题目&#xff1a; 题解&#xff1a; class Solution:def countArrangement(self, n: int) -> int:f [0] * (1 << n)f[0] 1for mask in range(1, 1 << n):num bin(mask).count("1")for i in range(n):if mask & (1 << i) and (num % (i …

Windows无法访问\\192.168.1.156,错误代码0x800704cf

1.首先要保证网络与共享中心的高级共享设置要打开 2.其他要保证两个机器在一个局域网 最简单的验证方法就是要相互可以ping通 3.如果满足以上条件还是会访问失败 4.可能的原因之一&#xff1a;防火墙设置 你要确保&#xff1a; 网络发现文件传送程序文件和打印机共享 在对应…

蓝桥杯 区间移位--二分、枚举

题目 代码 #include <stdio.h> #include <string.h> #include <vector> #include <algorithm> #include <iostream> using namespace std; struct node{ int a,b; }; vector<node> q; bool cmp(node x,node y){ return x.b <…

华为ENSP--ISIS路由协议

项目背景 为了确保资源共享、办公自动化和节省人力成本&#xff0c;公司E申请两条专线将深圳总部和广州、北京两家分公司网络连接起来。公司原来运行OSFP路由协议&#xff0c;现打算迁移到IS-IS路由协议&#xff0c;张同学正在该公司实习&#xff0c;为了提高实际工作的准确性和…