day01_原题1/7/26/27/206

1.两数之和(原题1)

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

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍

示例 :

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

(1)解题思路:
对于这种问题,直接暴力破解即可解决问题。也就是通过使用两个for循环不断遍历
(2)代码

class Solution:
	def twoSum(self,nums:List[int],target:int)->List[int]:
	for i in range(len(nums)):
		for j in range(i+1len(nums)):
			if nums[i] + nums[j] == target :
				return [i,j]	# 这里有个坑就是容易写成 return nums[i],nums[j]

执行时间比较大,看了一圈其他人的解法,用字典的解法都是大同小异:

class Solution:
	def twoSum(self,nums:List[int],target:int)->List[int]:
	dict = {}	# 创建一个空字典用于保存
	for i,n in enumerate(nums): # 遍历列表的同时查字典
		if (target-n) in dict:	# 查看差是否在键中
			return dict[target-n],i
		else:	# 否则将其数作为键,索引作为值添加到字典
			dict[n] = i	

enumerate()函数可用于将一个可遍历的数据对象(如列表、元组、字符串)组合成一个索引数列,同时列出数据数据下标,一般在for循环中。

语法:

enumerate(sequence,[start=0])
  • sequence,一个序列、迭代器或者其他主持迭代对象
  • start,下标起始位置

例子:

seq = ['one','two','three']
for i,element in enumerate(seq):
	print(i,element)

结果:

0 one
1 two
2 three

2.整数反转(原题7)

给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转

示例 1:

输入: 123
输出: 321

示例 2:

输入: -123
输出: -321

(1)解题思路

这是典型的字符串题目,可先将输入的数字进行转化为字符串,然后对其进行切片,然后再转换为int类型进行取值范围判断。

(2)代码

class Solution:
    def reverse(self, x: int) -> int:
    if x >= 0:
    	y = int(str(x)[::-1])
    else:
    	y = -int(str(x)[:0:-1])
    if (-2**31 < y < 2**31-1):
    	return y
    else:
    	return 0

使用高级用法就是:

class Solution:
    def reverse(self, x: int) -> int:
    y = int(str(x)[::-1]) if x >= 0 else -int(str(x)[:0:-1])
    return y if (-2**31 < y < 2**31-1) else 0

注:

str[start:stop:step]   遵循【左闭右开】规则

>>> str = "-123"
>>> print(str[::-1])
321-
>>> print(str[:0:-1])
321
>>>

3.移除元素(原题 27)

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

示例:

给定 nums = [3,2,2,3], val = 3,

函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。

你不需要考虑数组中超出新长度后面的元素。

(1)解题思路:

题目中要求判断val的值是否在nums里面,可使用remove函数直接将val在nums里面的值删除,这种方法不需要考虑nums里面是否有重值的情况.最后使用len函数返回结果

(2)代码:

class Solution(object):
	def removeElement(self,nums,val):
		while True:
			if val in nums:
				nums.remove(val)
			else:
				break
		return len(nums)

4.删除排序数组中的重复项(原题26)

给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。

不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

示例:

给定数组 nums = [1,1,2], 

函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。 

你不需要考虑数组中超出新长度后面的元素。

(1)解题思路:

这道题和上文第一题的思路是一样的,因为列表如果有重复的元素,只需要删除重复元素的第一元素就可以了,没有重复的相邻元素,则移动指针;

(2)代码:

class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        i = 0
        lenth = len(nums)
        while (i < lenth-1):
            if nums[i] == nums[i+1]:
                nums.pop(i)
                lenth -= 1
            else:
                i += 1

相邻的元素可以直接使用set函数进行排序删除,然后再将剩余元素赋值给新列表,最后返回新列表的长度.

class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
    newNums = sorted(list(set(nums)))
    for i in range(len(newNums)):
    	nums[i] = newNums[i]
    return len(newNum)
  • set()创建的是一个无序不重复的元素集.可以删除重复的数据
  • sort()用于对原列表进行排序
list.sort(cmp=None,key=None,reverse=False)
  • sorted()可对所有可迭代的对象进行排序
sorted(iterable,cmp=None,key=None,reverse=Flase)

5.反转列表(原题206)

反转一个单链表。

示例:

输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

(1)解题思路
典型的链表题目.

(2)代码

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
        # 如果链表为空,,则返回 None
        if head == None or head.next == None:
    		return head
    	p = self.reverseList(head.next)
        # 交换头尾数据
    	head.next.next = head
        # 尾指针为空
    	head.next = None
    	return p
展开阅读全文

Windows版YOLOv4目标检测实战:训练自己的数据集

04-26
©️2020 CSDN 皮肤主题: 数字20 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值