[804. 唯一摩尔斯密码词]
国际摩尔斯密码定义一种标准编码方式,将每个字母对应于一个由一系列点和短线组成的字符串, 比如:
-
'a'
对应".-"
, -
'b'
对应"-..."
, -
'c'
对应"-.-."
,以此类推。
为了方便,所有 26
个英文字母的摩尔斯密码表如下:
[".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."]
给你一个字符串数组 words
,每个单词可以写成每个字母对应摩尔斯密码的组合。
-
例如,
"cab"
可以写成"-.-..--..."
,(即"-.-."
+".-"
+"-..."
字符串的结合)。我们将这样一个连接过程称作 单词翻译 。
对 words
中所有单词进行单词翻译,返回不同 单词翻译 的数量。
示例 1:
输入: words = ["gin", "zen", "gig", "msg"] 输出: 2 解释: 各单词翻译如下: "gin" -> "--...-." "zen" -> "--...-." "gig" -> "--...--." "msg" -> "--...--." 共有 2 种不同翻译, "--...-." 和 "--...--.".
示例 2:
输入:words = ["a"] 输出:1
提示:
-
1 <= words.length <= 100
-
1 <= words[i].length <= 12
-
words[i]
由小写英文字母组成
|---map接口:双列集合:用来存储(key-value)集合 映射 * * |--- hashmap :作为map的主要实现类 线程不安全 效率高,存储null和value 健壮性好 * |---linkedhashmap:保证在遍历map元素时,可以按照添加的顺序实现遍历 * 原因:在原有的HashMap的底层结构基础上,添加了一堆指针,指向前一个和后一个元素。 * 对于频繁的遍历操作,此类执行效率高于HashMap * |---treemap 保证按照添加的KEy-value对进行排序,实现排序遍历 此时考虑key的自然排序和定制排序 * 底层使用红黑树(二叉树,平衡二叉树) * |---hashtable: 作为古老的实现类:线程安全的 效率低 都有syn * |---properties * 处理属性文件 * * * 底层原理 jdk8 jdk7之间的区别 源码 * * * * HashMap的底层 :数组+链表+红黑树(jdk8) * * * 1.面试题 * HashMap底层实现原理?! * HashMap和Hashtable的异同 * CurrentHashMap与Hashtable的异同? * * 二、Map的结构理解 * map中的key:无序的,不可重复的,使用set存储的所有key * map中的value:无序的,可重复的,使用Collection存储所有的value * 一个键值对key——value构成了一个Entry对象 * Map中的entry无序的,不可重复的,使用set存储entry * * HashMap的底层实现原理?以JDK7.0为例 * Hash Map = new HashMap(); * 在实例化以后,底层创建了长度是16的一维数组Entry[] table. * 可能已经执行过多次put * map.put(key1,value1): * 首先,调用key1所在类的hashCode()计算key1哈希值,此哈希值经过某种算法计算以后,得到在Entry数组中的存放位置。 * 如果此时数据为空,此时的key1-value1添加成功。 * 如果此时数据不为空,(意味着此位置上存在一个或多个数据(一链表形式存在)),比较key1和已存在的一个或多个数据的哈希值: * 如果key1的哈希值与已经存在的数据的哈希值都不相同,此时key1-value1添加成功。 * 如果此时哈希值与已存在的数据的哈希值相同,此时判断key1-value1的值,调用key所在类的equals()方法 * equals()返回false 添加成功 * equals()返回ture 使用value1替换相同key的value2值 * 情况二和情况三: * 在不断添加的过程中,会涉及到扩容问题,默认的扩容方式:扩容为原来的容量的2倍,并将原有的数据复制过来。 * jdk8:相比较jdk7在底层实现方面的不同: * 1.new Hashmap(); 底层没有创建一个长度为16的数组; * 2.jdk8底层的数组是:Node[],而非Entry[] * 3.首次调用put()方法时,底层创建长度为16的数组 * 4.jdk7底层结构只有:数据+链表,jdk8中底层结构:数组+链表+红黑树 * 当数组的某一个索引位置上的元素以链表形式存在的数据个数>8 且当前数组长度>64。 * 此时此索引位置上的所有数据改为使用红黑树存储。 (方便查找) * * linkedHashMap的底层实现原理(了解) * * * Collections和Collection的区别 * 前者时工具类 后者是存储单位数据的接口
一、ArrayList 和 LinkedList: 1、区别: (1)ArrayList是基于动态数组的数据结构,查询快,增删慢,线程不安全。 LinkedList是基于链表的数据结构,查询慢,增删快。线程不安全。 (2)对ArrayList和LinkedList而言,在列表末尾增加一个元素所花的开销都是固定的。 (3)对ArrayList而言,主要开销是在内部数组中增加一项
方法类型相同:需要注意的位置有三个
stringBuilder 和string ,stringbuffer的区别
stringBuilder.append()和string "+"之间的关系
hashset hashmap的区别
class Solution { public static final String[] map = {".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.." }; public int uniqueMorseRepresentations(String[] words) { • Set<String> a = new HashSet<String>(); • //存放需要输出的输出的东西 • for(String word : words){ • // StringBuilder code = new StringBuilder(); • String zode = new String(); • String xode = new String(); • String qode = new String(); • for(int i = 0; i<word.length();i++){ • • char c = word.charAt(i); • // code.append(map[c-'a']); • zode = map[c-'a']; • xode = qode + zode; • qode = xode; • } • a.add(xode.toString()); • //a.add(code.toString()); • } • return a.size(); } }