今早突然就想来刷刷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刷题链接放下面啦!
要继续加油鸭!