242.有效的字母异位词 leetcode地址
class Solution {
public boolean isAnagram(String s, String t) {
int[] recode = new int[26];
for(int i = 0; i < s.length();i++){
recode[s.charAt(i) - 'a']++;
}
for(int i = 0; i < t.length();i++){
recode[t.charAt(i) - 'a']--;
}
for(int c : recode){
if(c != 0){
return false;
}
}
return true;
}
}
class Solution {
public boolean isAnagram(String s, String t) {
int[] recode = new int[26];
for(char si : s.toCharArray()){
recode[si - 'a']++;
}
for(char ti : t.toCharArray()){
recode[ti - 'a']--;
}
for(int c : recode){
if(c != 0){
return false;
}
}
return true;
}
}
两种for写法:区别在于返回char的方法。主要区别:
特性 | .toCharArray() | .charAt(int index) |
---|---|---|
返回类型 | char[] | char |
用途 | 获取所有字符的数组 | 获取特定位置的单个字符 |
适用场景 | 需要遍历或修改多个字符时 | 需要访问特定位置的字符时 |
for(char si : s.toCharArray()){
recode[si - 'a']++;
}
for(char ti : t.toCharArray()){
recode[ti - 'a']--;
}
for(int c : recode){
if(c != 0){
return false;
}
}
第一次写这样形式 的for循环,以后多熟悉。
349. 两个数组的交集 leetcode地址
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
Set<Integer> set1 = new HashSet<>();
Set<Integer> set2 = new HashSet<>();
for(int num : nums1){
set1.add(num);
}
for(int num : nums2){
if(set1.contains(num)){
set2.add(num);
}
}
//方法一:set2转化为Array
int[] arr = set2.stream().mapToInt(Integer::intValue).toArray();
//方法二:建一个数组arr放入set2的内容
int[] arr = new int[set2.size()];
int j = 0;
for(int i : set2){
arr[j++] = i;
}
return arr;
}
}
这个方法利用了 Set
中无重复元素的特性来确保结果中的元素唯一,并且实现简单高效。
其中在 Java 中,.contains()
方法用于检查集合中是否包含指定的元素。具体来说,.contains()
方法的行为取决于集合的类型(如 Set
、List
等)。
第一种set返回数组方法解释:
这行代码的作用是将一个 Set<Integer>
转换为一个 int[]
数组。以下是对这行代码的详细解释:
set2.stream().mapToInt(x -> x).toArray();
int[] arr = set2.stream().mapToInt(Integer::intValue).toArray();
-
set2.stream()
:- 这部分代码将
set2
(一个Set<Integer>
)转换为一个流(Stream)。流是 Java 8 引入的一种处理集合的方式,可以通过流来进行各种操作,如过滤、映射和收集等。
- 这部分代码将
-
mapToInt(Integer::intValue)
:mapToInt
是一个中间操作,用于将流中的每个元素映射为一个int
值。Integer::intValue
是一个方法引用,表示对每个Integer
对象调用intValue()
方法,以获得其基本类型int
的值。- 结果是一个
IntStream
,它是专门用于处理基本类型int
的流。
-
toArray()
:toArray()
是一个终止操作,用于将流中的元素收集到一个数组中。- 由于之前的操作生成的是
IntStream
,调用toArray()
会返回一个int[]
类型的数组。
复习 运算符类型
-
&&
(逻辑与):- 当且仅当两个操作数都为
true
时,结果才为true
;否则为false
。 - 短路操作符:如果第一个操作数为
false
,则不会计算第二个操作数,因为结果已经确定为false
。
- 当且仅当两个操作数都为
-
||
(逻辑或):- 只要有一个操作数为
true
,结果就为true
;只有当两个操作数都为false
时,结果才为false
。 - 同样是短路操作符:如果第一个操作数为
true
,则不会计算第二个操作数,因为结果已经确定为true
。
- 只要有一个操作数为
202. 快乐数 leetcode地址
做这道题前需要先会写,取一个数值其各个位置上的单个数的方法。
List<Integer> num = new ArrayList<>();
// 处理负数
number = 1234;
while (number > 0) {
int digit = number % 10; // 取出最后一位
num.add(digit); // 添加到结果列表
number /= 10; // 去掉最后一位
}
class Solution {
public boolean isHappy(int n) {
Set<Integer> set = new HashSet<>();
while(n != 1 && !set.contains(n)){
set.add(n);
n = getNextNumber(n);
}
return n == 1;
}
private int getNextNumber(int n){
int res = 0;
while(n > 0){
int temp = n % 10;
res += temp*temp;
n = n / 10;
}
return res;
}
}
当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法了。
所以这道题目使用哈希法,来判断这个sum是否重复出现,如果重复了就是return false, 否则一直找到sum为1为止。
1. 两数之和 leetcode地址 leetcode地址
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer,Integer> map = new HashMap<>();
for(int i = 0; i < nums.length; i++ ){
int temp = target - nums[i];
if (map.containsKey(temp)) {
return new int[]{i,map.get(temp)};
}else{
map.put(nums[i],i);
}
}
return null;
}
}
在解决“两数之和”问题时,使用哈希表(Map
)是因为它能够提供高效的查找和存储功能。以下是对你问题的详细解答:
1. 为什么会想到用哈希表
-
快速查找:哈希表提供 O(1) 的平均时间复杂度来查找元素。在“两数之和”问题中,我们需要快速判断一个数是否已经存在,以便找到目标值。
-
避免嵌套循环:如果使用数组遍历的方法(嵌套循环),时间复杂度为 O(n²),而使用哈希表可以将其降到 O(n),从而提高效率。
2. 哈希表为什么用 Map
-
键值对存储:
Map
接口允许存储键值对,这使得我们可以将数字和其索引相关联。这样可以方便地查找和更新。 -
灵活性和多种实现:
Map
提供了多种实现方式,如HashMap
、TreeMap
等,开发者可以根据具体需求选择最合适的实现。
3. 本题中 map
是用来存什么的
- 在“两数之和”问题中,
map
用于存储数组中的数字及其对应的索引。这样可以在遍历数组时快速查找是否存在与当前数字配对的数字。
4. map
中的 key
和 value
用来存什么的
-
Key:在本题中,
key
是数组中的数字。每个数字作为key
存储在哈希表中。 -
Value:对应的
value
是该数字在数组中的索引。这使得我们可以在找到配对的数字时,快速返回它们的索引。
本节中的代码几乎都不熟练,都是连看带写的,周末注意复刷
算法3h
博客1h