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 | class Solution { |
这段代码主要用到了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 | class Solution(object): |
下面是高级版python代码:希望以后再回来看将它弄懂
1 | class Solution: |
下面是java的代码:
简单暴力型的主要是用到java自带的函数:
1 | ///简单粗暴,看看就行 |
解法二:
进阶解法—数学解法
通过取整和取余操作获取整数中对应的数字进行比较。
举个例子:1221 这个数字。具体做法如下:
- 通过计算 1221 / 1000, 得首位1
- 通过计算 1221 % 10, 可得末位 1
- 进行比较
- 再将 22 取出来继续比较
1 | class Solution { |
解法三:
进阶解法—巧妙解法
直观上来看待回文数的话,就感觉像是将数字进行对折后看能否一一对应。
所以这个解法的操作就是 取出后半段数字进行翻转。
这里需要注意的一个点就是由于回文数的位数可奇可偶,所以当它的长度是偶数时,它对折过来应该是相等的;当它的长度是奇数时,那么它对折过来后,有一个的长度需要去掉一位数(除以 10 并取整)。
具体做法如下:
- 每次进行取余操作 ( %10),取出最低的数字:
y = x % 10
- 将最低的数字加到取出数的末尾:
revertNum = revertNum * 10 + y
- 每取一个最低位数字,x 都要自除以 10
- 判断 x 是不是小于
revertNum
,当它小于的时候,说明数字已经对半或者过半了 - 最后,判断奇偶数情况:如果是偶数的话,revertNum 和 x 相等;如果是奇数的话,最中间的数 字就在revertNum 的最低位上,将它除以 10 以后应该和 x 相等。
1 | class Solution { |
14. 最长公共前缀
难度 easy 题目名称
题目摘要
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。
示例 1:
输入: [“flower”,”flow”,”flight”]
输出: “fl”
示例 2:
输入: [“dog”,”racecar”,”car”]
输出:""
解释: 输入不存在公共前缀。
思路
首先判断字符串是否为空,如果是直接输出""
之后建立两个for循环,第一层循环是遍历第一个字符串,第二个循环是从第二个字符串开始和第一个字符串进行比较,这里有一些反常,就是不满足条件就退出。这个条件是i大于字符串的长度,或者就是遇到不相等的了,返回这个前缀,当然如果是一个空字符串,就返回""
1
2
3
4
5
6
7
8
9class 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
17class 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} —- $$