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;
    }
}

 

posted @ 2020-02-17 10:58  zhaoxuan8  阅读(129)  评论(0编辑  收藏  举报