q1:两数之和
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:
输入:nums = [3,2,4], target = 6
输出:[1,2]
示例 3:
输入:nums = [3,3], target = 6
输出:[0,1]
线性查找:外部循环确定第一个元素x,内部循环线性查找 target-x 。
import java.util.HashMap;
class Solution {
public int[] twoSum(int[] nums, int target) {
if(nums ==null || nums.length == 0) return new int[0];
for (int i=0; i<nums.length; i++){
int x = nums[i];
//线性查找
for (int j=i+1; j<nums.length; j++){
if (nums[j] == target-x){
return new int[]{i,j};
}
}
}
return new int[0];
}
}
利用hash:将数据的元素都put进一个HashMap,然后循环判断是否包含targe-x
import java.util.HashMap;
class Solution {
public int[] twoSum(int[] nums, int target) {
if(nums ==null || nums.length == 0) return new int[0];
HashMap<Integer,Integer> map = new HashMap<>();
for (int i=0; i<nums.length;i++){
map.put(nums[i],i);
}
for (int i=0; i<nums.length ;i++){
int x= nums[i];
if (map.containsKey(target-x)){
int index = map.get(target-x);
if (i!=index) return new int[]{i,index};
}
}
return new int[0];
}
}
优化:
import java.util.HashMap;
class Solution {
public int[] twoSum(int[] nums, int target) {
if(nums ==null || nums.length == 0) return new int[0];
HashMap<Integer,Integer> map = new HashMap<>();
for (int i=0; i<nums.length ;i++){
int x= nums[i];
if (map.containsKey(target-x)){
int index = map.get(target-x);
return new int[]{i,index};
}
map.put(x,i);
}
return new int[0];
}
}
q387:字符串中的第一个唯一字符
给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。
示例:
s = “leetcode”
返回 0
s = “loveleetcode”
返回 2
第一次遍历将字符和出现次数put进HashMap,第二次遍历将第一个出现次数为1的元素下边输出。
class Solution {
public int firstUniqChar(String s) {
HashMap<Character,Integer> hashMap = new HashMap<>();
for (int i=0;i<s.length();i++){
char ch = s.charAt(i);
hashMap.put(ch,hashMap.getOrDefault(ch,0)+1);
}
for (int i=0;i<s.length();i++){
if (hashMap.get(s.charAt(i)) == 1)
return i;
}
return -1;
}
}