leetcode 1-50

最近更新: 2020-6-6 upds。

1. 两数之和

Given an array of integers, return indices of the two numbers such that they add up to a specific target.

You may assume that each input would have exactly one solution, and you may not use the same element twice.

Example:

Given nums = [2, 7, 11, 15], target = 9,

Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].

这个是没有用到字典的代码,虽然实现了上述功能但是,时间花费很多。

1
2
3
4
5
6
7
8
9
10
>class Solution:
>def twoSum(self, nums,target):
>for i in nums:
> j=target-i
> start_index = nums.index(i)
> next_index = start_index+1
> temp_nums = nums[next_index:] //将从next_index到最后最后这些元素新建一个Array
> if j in temp_nums: //判断一下j是否在temp_nums这个数组中
> return(nums.index(i),next_index+temp_nums.index(j))
>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Solution {
public int[] twoSum(int[] nums, int target) {
if (nums == null || nums.length<2){
return new int[]{-1,-1};
}
int[] res=new int []{-1,-1}; //为了存最后的访问结果
HashMap<Integer,Integer > map = new HashMap<>();//定义一个HashMap
for(int i =0;i<nums.length;i++){ //遍历这个数组
if (map.containsKey(target-nums[i])){
res[0]= map.get(target-nums[i]);
res[1]=i;
break;
}
map.put(nums[i],i); //HashMap存对应的每个值,和index
}
return res;

}
public static void main(String[] args){

}

}

这段代码主要用到了hashmap的算法,大大提高了效率,但是暂时还不会

9. 回文数

题目摘要

判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

思路

一些一定不为回文数的数:
1.负数
2.大于0,但末位为0的数(x> 0 && x % 10 == 0)
如果是上面这些情况则直接返回false。

将整数的每一位存入数组中,arr[i]代表整数的倒数i+1位。

然后判断arr[i]是否和arr[num -1 -i]位是否相等,如果相等则判断下一位;否则返回false
当i> num-i-1时如果还没返回则代表所有字符的是相对称的,也就是回文数,返回true

下面是python的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution(object):
def isPalindrome(self, x):
"""
:type x: int
:rtype: bool
"""
a=abs(x)
sum=0
while(a!=0):
p=x%10
sum=sum*10+p
a=a//10
if x>=0 and x==sum:
return True
else:
return False

下面是高级版python代码:希望以后再回来看将它弄懂

1
2
3
4
class Solution:
def isPalindrome(self, x: int) -> bool:
r = list(map(lambda i: int(10**-i * x % 10), range(int(math.log10(x)), -1, -1))) if x > 0 else [0, x]
return r == r[::-1]

下面是java的代码:

简单暴力型的主要是用到java自带的函数:

1
2
3
4
5
6
7
///简单粗暴,看看就行
class Solution {
public boolean isPalindrome(int x) {
String reversedStr = (new StringBuilder(x + "")).reverse().toString();
return (x + "").equals(reversedStr);
}
}

解法二:

进阶解法—数学解法
通过取整和取余操作获取整数中对应的数字进行比较。

举个例子:1221 这个数字。具体做法如下:

  • 通过计算 1221 / 1000, 得首位1
  • 通过计算 1221 % 10, 可得末位 1
  • 进行比较
  • 再将 22 取出来继续比较
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Solution {
public boolean isPalindrome(int x) { //定义一个布尔类型的方法
//边界判断
if (x < 0) return false;
int div = 1;
//
while (x / div >= 10) div *= 10;
while (x > 0) {
int left = x / div;
int right = x % 10;
if (left != right) return false;
x = (x % div) / 10;
div /= 100;
}
return true;
}
}

解法三:

进阶解法—巧妙解法
直观上来看待回文数的话,就感觉像是将数字进行对折后看能否一一对应。

所以这个解法的操作就是 取出后半段数字进行翻转。

这里需要注意的一个点就是由于回文数的位数可奇可偶,所以当它的长度是偶数时,它对折过来应该是相等的;当它的长度是奇数时,那么它对折过来后,有一个的长度需要去掉一位数(除以 10 并取整)。

具体做法如下:

  • 每次进行取余操作 ( %10),取出最低的数字:y = x % 10
  • 将最低的数字加到取出数的末尾:revertNum = revertNum * 10 + y
  • 每取一个最低位数字,x 都要自除以 10
  • 判断 x 是不是小于revertNum ,当它小于的时候,说明数字已经对半或者过半了
  • 最后,判断奇偶数情况:如果是偶数的话,revertNum 和 x 相等;如果是奇数的话,最中间的数 字就在revertNum 的最低位上,将它除以 10 以后应该和 x 相等。
1
2
3
4
5
6
7
8
9
10
11
12
class Solution {
public boolean isPalindrome(int x) {
//思考:这里大家可以思考一下,为什么末尾为 0 就可以直接返回 false
if (x < 0 || (x % 10 == 0 && x != 0)) return false;
int revertedNumber = 0;
while (x > revertedNumber) {
revertedNumber = revertedNumber * 10 + x % 10;
x /= 10;
}
return x == revertedNumber || x == revertedNumber / 10;
}
}

14. 最长公共前缀

难度 easy 题目名称

题目摘要

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

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

示例 1:

输入: [“flower”,”flow”,”flight”]
输出: “fl”
示例 2:

输入: [“dog”,”racecar”,”car”]
输出:""
解释: 输入不存在公共前缀。

思路

首先判断字符串是否为空,如果是直接输出""之后建立两个for循环,第一层循环是遍历第一个字符串,第二个循环是从第二个字符串开始和第一个字符串进行比较,这里有一些反常,就是不满足条件就退出。这个条件是i大于字符串的长度,或者就是遇到不相等的了,返回这个前缀,当然如果是一个空字符串,就返回""

1
2
3
4
5
6
7
8
9
class Solution:
def longestCommonPrefix(self, strs: List[str]) -> str:
if not strs:
return""
for i in range(len(strs[0])):
for string in strs[1:]: #从列表中第一个位置与第0的位置比较
if i>=len(string) or string[i] != strs[0][i] : #就是遍历的i大于单词的长度
return strs[0][:i]
return strs[0] #如果是一个[""],这种情况下返回第一个字符

下面是高级一些的python代码:

思路2

我先设置一个空的字符串,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Solution:
def longestCommonPrefix(self, strs: List[str]) -> str:
result =""
i=0
while True:
try:
sets=set(string[i]for string in strs)
#因为set是集合的概念,遍历这个列表的每一个字符串的第i位,输出的都是不同的值,如果相同就输出一个,
if len(sets)==1: #如果对应位置不是同一个字符,那么就不会是1
result+=sets.pop()
# pop是出栈的意思,后进后出(当然也只有一个元素)弹出加在result后面
i+=1
#在去检查下一个字符
else: break
except Exception as e: #
break
return result

$$ —- \mathcal{End} —- $$

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×