力扣刷题day01

两数之和

        在一个数组中找到两个元素,使得他们的和为传入的target,返回他们的下标,元素只可用一次。

1、暴力解法

        双层for循环遍历数组,使得每两个元素都相加一次进行比较。

class Solution {
    public int[] twoSum(int[] nums, int target) {
         int [] a = new int [2];
         for(int i = 0;i < nums.length - 1;i++){
             for(int j = i+1;j < nums.length;j++){
                if(nums[i] + nums[j] == target){
                    a[0] = i;
                    a[1] = j;
                }
             }
         }
         

          return a;
    }
}

2、使用hashmap

        使用hashmap结构,元素作为key,下标作为value,把数组的第一个元素和下标放入哈希表中,从第二个元素开始循环比较。倘若target和循环的元素的差值在哈希表中存在,那么就返回该元素的下标和哈希表中的以差值作为key的value值。倘若不存在,则把该元素和下标放入哈希表中。

class Solution {
    public int[] twoSum(int[] nums, int target) {
       int length = nums.length;
         for(int i = 0; i < length; i++){
             for(int j =i+1; j<length; j++){
                 if(nums[i] + nums[j] == target){
                     return new int[]{i,j};
                 }
             }
         }   
         return new int[0];
    }
}

回文数

        回文数是指一个整型正向遍历和反向遍历元素一致。

解法:负数显然不是回文数,所以先进行正负值的判断。然后把该整数转为String类型,再使用使用StringBuffer 的reverse()方法进行反转,反转后的字符串和反转前进行比较。

class Solution {
    public boolean isPalindrome(int x) {
        if(x < 0) return false;
        StringBuffer sb = new StringBuffer(String.valueOf(x));
        return sb.reverse().toString().equals(String.valueOf(x));
    }
}

罗马数字转整数

        把罗马数字转为对应的十进制整数

解法:一串罗马数字可以把它进行拆分,最后的整数值就是拆分后每个字符对应的数值相加。通常数值较大的在左边,数值较小的在右边。但是有一种特殊情况,例如IV表示4。数字较小的I在左边,这个时候的结果就是V-I的值。

        所以我们把各个罗马字符对应的数字存放到哈希表中,对整个罗马数字字符进行遍历,如果左边比右边的数值小就进行减法,左边的数值更大就进行加法,最后返回结果。

class Solution {
     public int romanToInt(String s) {
        int length = s.length();
        int result = 0;
        Map<Character, Integer> map = new HashMap<>();
        map.put('I',1);
        map.put('V',5);
        map.put('X',10);
        map.put('L',50);
        map.put('C',100);
        map.put('D',500);
        map.put('M',1000);

        for (int i = 0;i < length;i++){
            if(i<length-1 && map.get(s.charAt(i)) < map.get(s.charAt(i+1))){
                result -= map.get(s.charAt(i));
            }else {
                result += map.get(s.charAt(i));
            }
        }
        return result;
    }
}

最长公共前缀

        找出字符串数组中每个元素共有的最长前缀。

解法:我们可以先定义一个方法substring()两两进行比较,找出两个字符串共有的前缀。公共前缀肯定比两个元素的长度都短,所以我们找出较短的长度,以此为条件比较两个字符串中的单个字符是否相等,最后使用substring()截取相应的公共前缀。然后我们遍历整个字符串数组,把第一个元素当做共有前缀,定义一个变量prefix接收,调用上面定义的方法和下一个元素进行寻找公共前缀,最后赋值给prefix变量,这样当整个数组都遍历完后,得出的就是最长公共前缀。

class Solution {
    public String longestCommonPrefix(String[] strs) {
            if (strs == null || strs.length == 0){
            return  "";
        }
        String prefix = strs[0];
        int length = strs.length;
        for (int i = 1; i<length;i++){
            prefix = subString(prefix,strs[i]);
            if (prefix.length() == 0){
                break;
            }
        }
        return prefix;
    }

    //截取两个字符串的最长子串
    public String subString(String str1,String str2){
        int length = Math.min(str1.length(),str2.length());
        int index = 0;
        while (index < length && str1.charAt(index) == str2.charAt(index)){
            index++;
        }
        return str1.substring(0,index);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值