代码随想录刷题day6
day5是周日,用于复习这一周的题目(实际上是在补进度hh
今天是hash表的简单题目,这个数据结构用途很广泛,我在求链表环那道题中也用到了这种数据结构。
242-有效的字母异位词
这道题是判断两个字符串中是否还有的字母种类和对应数量一致,如果是则返回true,不是则返回false。
其实题目中已经有提示了,因此可以采用26大小的数组来做,卡哥文章提到数组也是一种哈希表,确实,在我看来,数组就是一种特殊的哈希表,因为数组的地址是连续的,而哈希一般是经过某种算法得到的地址,且二者均是随机存储,即存取效率很高,直接通过地址获得。
class Solution {
public boolean isAnagram(String s, String t) {
// 如果记不得小a代表的数字是多少,则可以通过这种方式获得
int offset = 'a' - 0;
int[] arr = new int[26];
// s字符串字母出现一次加一
for(int i=0;i<s.length();i++){
int index = s.charAt(i) - offset;
arr[index]++;
}
// t字符串字母出现一次减一
for(int i=0;i<t.length();i++){
int index = t.charAt(i) - offset;
arr[index]--;
}
// 如果最终26个元素都为0,则返回true。否则返回false
for(int i=0;i<arr.length;i++){
if(arr[i] != 0){
return false;
}
}
return true;
}
}
349-两个数组的交集
典型的使用set来解决,思路简单,只是set转集合这个语法自己不熟悉:可通过toArray将集合转为数组,但是这时集合的每个元素均是Object对象
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
// 这个用来存储nums1中出现的数
HashSet<Integer> s = new HashSet<>();
// 用于存储交集
HashSet<Integer> s1 = new HashSet<>();
for(int i=0;i<nums1.length;i++){
s.add(nums1[i]);
}
for(int i=0;i<nums2.length;i++){
// 判断,有则是共同的元素
if(s.contains(nums2[i])){
s1.add(nums2[i]);
}
}
int[] arr = new int[s1.size()];
int i=0;
// set转数组
for(Object o: s1.toArray()){
arr[i++] = (int)o;
}
return arr;
}
}
202-快乐数
这题本质上就是考基本功,思路不难,需要获得数的每位数,然后判断是否会变为1,如果可以变成1则直接返回true,然后通过hashset判断是否会走入循环,一旦set添加失败,表明是走入了循环
class Solution {
public boolean isHappy(int n) {
HashSet<Integer> set = new HashSet<>();
int sum = 0;
while(true){
int digit = n % 10;
sum += digit*digit;
n = n / 10;
if(n == 0){
n = sum;
// 只要和为1就是快乐数
if(sum == 1){
return true;
}
sum = 0;
// 只要出现了相同的数就是进入了循环
if(!set.add(n)){
return false;
}
}
}
}
}
1-两数之和
通过map来解决(因为要返回索引,而set没有索引),但是使用的方式有点不一样,仔细体会
class Solution {
public int[] twoSum(int[] nums, int target) {
HashMap<Integer, Integer> map = new HashMap<>();
int[] arr = new int[2];
for(int i=0;i<nums.length;i++){
int key = target-nums[i];
// 每次判断set中有无对应的数值,有则返回
if(map.containsKey(key)){
arr[0] = map.get(key);
arr[1] = i;
return arr;
}
// 没有则将数值与索引存上,等待后续比较
map.put(nums[i], i);
}
// 因为题目说了一定有答案,因此这条语句不会执行,为了通过语法检查而写
return arr;
}
}
总结
越来越觉得所谓的算法就是熟悉套路,太卷我也卷不动,掌握基本的就够了,重点抓项目!