leetcode收获(1、7、9、13、14)
str.substring(x,y);//输出字符串str的从x位置开始到y位置的前面结束的子字符串
str.substring(x);//从字符串str的的第x个字符截取
str.charAt(n);//返回字符串str的第n个位置的字符(从0开始)
Map<Integer,Integer> map = new HashMap<>();//声明hashmap对象,键值对均为int类型
map.containKey(x);//boolean类型,在当前hashmap中有没有键为x的键,有,返回true,反之返回false
map.containValue(x);//boolean类型,在当前hashmap中有没有值为x的值,有,返回true,反之返回false
map.put(x,y);//将键值对<x,y>放入hashmap
map.get(x);//取出键为x的值
1、两数之和:
①若数组有序,可设置两个指针pre和post分别从头尾遍历数组。
如果两指针指向的两元素之和大于target,则post指针向前移;
若小于target,则pre指针向后移,直到找到和等于target的两元素,返回pre和post的值(return new int[] {pre,post};),或者pre>post之后还没找到,就返回0;
②若数组无序,可以暴力遍历,两层循环查找。时间复杂度为O(n^2);
也可以使用hashmap,将键值对分别存放元素和下表,因为结果需要输出下标,将下标存放为值。开始时hashmap为空。
每次put进去一个键值对,用target减去键,并将所得值存为变量temp,在剩余当前hashmap的键中寻找是否有键的数值等于temp,有就返回其键值对中的值,也就是位置。时间复杂度为O(n);
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[] {map.get(temp),i};
}
else
map.put(nums[i],i);
}
return null;
}
}
2、整数反转
3、回文数
两题思路相似,中心思路是这样
while(x1 != 0){
res = res * 10 + x1 % 10;
x1 /= 10;
}
4、罗马数字转整数
重要的是找到关系,如果相邻两个罗马数字,左边比右边大或相等,就把左边罗马数字代表的数字加上
左边比右边小,就把左边罗马数字代表的数字减去,最后一个罗马数字代表的数字加上,即可转换成功。
5、最长公共前缀
思路如下图
class Solution {
public String longestCommonPrefix(String[] strs) {
if(strs.length == 0) return "";
if(strs.length == 1) return strs[0];
String ans = strs[0];
int j=0;
for(int i = 1;i < strs.length ;i++){
for(j = 0;j < strs[i].length() && j < ans.length(); j++){
if(ans.charAt(j) != strs[i].charAt(j))
break;}
System.out.println(j);
ans = ans.substring(0,j);
if(ans.equals("")) return ans;
}
return ans;
}
}