记录LeetCode的第一天| 8月更文挑战

469 阅读5分钟

今早突然就想来刷刷LeetCode上的题,就来了。。。所以这是一篇平平无奇的刷题笔记。

当然我准备先肝简单题,这里只是我自己写题时候一些知识缺漏的记录和小tips!

话不多说,拿来吧你~

第一题

两数之和

题目内容

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

以下是会用到的两个函数

  • map的containsKey方法

1.map是一个key和value的键值对集合。

2.map中的containsKey(key)方法是判断该key在map中是否有key存在。如果存在则返回true,反之,返回false。

3.例子:

判断数组中是否有1,有的话就返回1和1所在的位置

public class twoSum{

       public static int[] num(int[] nums){

               Map<Integer,Integer> map = new HashMap<>();

               for(int i=0;i<nums.length;i++){

                   if(map.containsKey(1)){

                       return new int[] {map.get(i),i};

                   }

                   map.put(nums[i],i);

               }

               return nums;

       }

   public static void main(String[] args){

       int a[] = new int[2];

       a[0]=1;a[1]= 2;

       int b[] = num(a);

       for(int i = 0;i<2;i++){

       System.out.println(b[i]);

       }

   }

}
  • map的put方法

调用put方法的时候首先判断hashmap数组是否为空数组,

(1)如果为空,进行初始化,判断key的值是否是null,

(2)如果是null,把对应的value值存进数组中下标为0的位置,

(3)计算key的hash值,并计算出下标,

(4)遍历下标对应的链表,匹配hash值和key的值,

如果存在,则覆盖,返回旧值

如果不存在,新添加一个,返回null

(5)如果扩容,是先扩容之后再把数据添加进新扩容的数组中 如果数组中元素的容量超过阈值,会触发扩容, 扩容是先把源数组放进一个临时数组中,获取老数组的长度,通过老数组长度乘2获取新数组长度,并创建新数组, 把临时数组中的数据通过重新计算下表,存进扩容后的数组中.

解题答案

(给出了两种解答)

// class Solution {

//   public int[] twoSum(int[] nums, int target) {

//     int temp;

//     int[] indexs = new int[2];

//     Map<Integer , Integer> map = new HashMap<>();

//     for(int i = 0;i < nums.length;i++){

//       temp = target - nums[i];

//       if(map.containsKey(temp)){

//         indexs[1] = i;

//         indexs[0] = map.get(temp);

//       }

//       map.put(nums[i],i);

//     }

//     return indexs;

//   }

// }

class Solution{

  public int[] twoSum(int[] nums,int target){

    for(int i = 0;i<nums.length;i++){

      for(int j = i+1;j<nums.length;j++){

        if(target == nums[i] + nums[j])

        return new int[] {i,j};

      }

    }

    return new int[] {};

  }

}

第二题

整数反转

题目内容

给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。

如果反转后整数超过 32 位的有符号整数的范围 [−231,  231 − 1] ,就返回 0。

假设环境不允许存储 64 位整数(有符号或无符号)。

(较简单)所以直接出实例:

输入:x = 123

输出:321

这里要记住的是    result =( result*10 +x % 10

简单快捷!!!

解题答案

class Solution {

  public int reverse(int x) {

    int result = 0;

    while(x != 0){

      int temp = result;

      result = (result * 10) + (x % 10);

      x /= 10;

      if(result / 10 != temp){

        return 0;

      }

    }

    return result;

  }

}

第三题

回文数

题目内容

给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。

回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。

与整数反转有所不同

这一题的key是需要为后面作比较所保留数据嗷~

其他的与上一题差不多。

解题答案

class Solution {

  public boolean isPalindrome(int x) {

    if(x < 0){

      return false;

    }

    int result = 0;

    int t = x;

    while( t != 0){

      //int temp = result;

      result = result *10 + t % 10;

      t /= 10;

      // if(result / 10 != temp){

      //   return false;

      // }

    }

    return result == x;

  }

}

第四题

罗马数字转整数

题目内容

罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。

字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。

通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:

I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。 X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。 C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。

解题答案

class Solution {

 public int romanToInt(String s) {

    s = s.replace("IV","a");

    s = s.replace("IX","b");

    s = s.replace("XL","c");

    s = s.replace("XC","d");

    s = s.replace("CD","e");

    s = s.replace("CM","f");

    int sum = 0;

    for(int i = 0; i < s.length();i++){

      sum += getValue(s.charAt(i));

    }

    return sum;

 }



 public int getValue(char c){

    switch(c){

      case 'I': return 1;

      case 'V': return 5;

      case 'X': return 10;

      case 'L': return 50;

      case 'C': return 100;

      case 'D': return 500;

      case 'M': return 1000;

      case 'a': return 4;

      case 'b': return 9;

      case 'c': return 40;

      case 'd': return 90;

      case 'e': return 400;

      case 'f': return 900;

    }

    return 0;

  }

}

这是我看到一位大佬写的,思路新颖可牛了!!可以自己好好学习这种思路,在之后做到举一反三!!!

这道题首先把特殊的罗马字符转成整数(便于之后的计算),再再写一个函数用Switch语句来判断字符类型并给出值,从而进行数学运算。

第五题

最长公共前缀

题目内容

编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串 ""

下面是会用到的函数

String中删除操作---str.subString(0,str.length()-1)

  • subString是String的一个方法,格式为:
public String substring(int beginIndex, int endIndex) 

返回一个新字符串,它是此字符串的一个子字符串。

该子字符串从指定的 beginIndex 处开始,一直到索引 endIndex - 1 处的字符。因此,该子字符串的长度为 endIndex-beginIndex。

String.indexOf(str)的用法

  • indexOf()方法可以返回某个指定的字符串值在字符串中首次出现的位置。
StringObject.indexOf(searchvalue.fromindex)

searchvalue必需。规定需检索的字符串值。

fromindex可选的整数参数。规定在字符串中开始检索的位置。它的3合法取值是0到-1.

提示:

(1)indexOf()方法对大小写敏感!

(2)如果要检索的字符串值没有出现,则该方法返回-1.

(3)int indexOf(int ch) 返回指定字符在此字符串中第一次出现处的索引。

(4)int indexOf(int ch, int fromIndex) 从指定的索引开始搜索,返回在此字符串中第一次出现指定字符处的索引。

(5)int indexOf(String str) 返回第一次出现的指定子字符串在此字符串中的索引。

(6)int indexOf(String str, int fromIndex) 从指定的索引处开始,返回第一次出现的指定子字符串在此字符串中的索引。

解题答案

class Solution {

  public String longestCommonPrefix(String[] strs) {

  if(strs.length == 0){
 
 return "";
}

String str = strs[0];

for(int i = 1;i < strs.length;i++){

  while(strs[i].indexOf(str)!=0){

    str = str.substring(0,str.length()-1);

  }

}

return str;
}
}

好啦~今天就写了这五道题,虽然其中也有参考了大佬的思路与代码,但是收获还是满满的!

LeetCode刷题链接放下面啦!

要继续加油鸭!

题库 - 力扣 (LeetCode) 全球极客挚爱的技术成长平台 (leetcode-cn.com)