2021-03-LeetCode-简单

1. 两数之和

class Solution(object):
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        result = []
        for i in range(len(nums)):
            for j in range(i+1, len(nums)):
                if (nums[i]+nums[j]) == target:
                    result.append(i)
                    result.append(j)
                    return result

哈希

​
def execute(numbers, target):
    hashdict = dict()
    for index,value in enumerate(numbers, start=1):
        if target-value in hashdict:
            return [hashdict[target-value], index]
        hashdict[numbers[index-1]] = index
    return []

numbers = [1,2,3,9,4,10,6]
target = 8
execute(numbers, target)

7. 整数反转 

import math
class Solution:
    def reverse(self, x: int) -> int:
        
        s = str(x)
        # s = x
        a = []
        a_rev = []

        for i in s:
            # print(i)
            a.append(i)
            
        a.reverse()
        if a[-1] == '-':
            a_rev.append('-')
            for i in a[:-1]:
                a_rev.append(i)
        else:
            for i in a:
                a_rev.append(i)
        # print(a_rev)
        
        result = ''
        for i in a_rev:
            result+=i
        result = int(result)
        if result >= (math.pow(2, 31))-1 or result <= (math.pow(-2, 31)):
            return 0
        return result

20. 有效的括号

class Solution:
    def isValid(s: str) -> bool:
        a = ['0']
        x = ['(', '{', '[']
        y = ['()', '{}', '[]']
        for i in s:
            if a != [] and (a[-1]+i) in y:
                a.pop()
            else:
                a.append(i)
                continue
        if a == ['0']:
            return True
        else:
            return False
        
Solution.isValid("](]")

73. 矩阵置零 

class Solution:
    def setZeroes(matrix):
        """
        Do not return anything, modify matrix in-place instead.
        """
        hang = list()
        lie = list()
        for i in range(len(matrix)):
            y = 0  # 列
            for j in matrix[i]:
                if j == 0:
                    hang.append(i)
                    lie.append(y)
                y += 1

        hang = list(set(hang))
        lie = list(set(lie))
        
        for h in hang:
            matrix[h] = len(matrix[h]) * [0]
        for l in lie:
            for i in range(len(matrix)):
                matrix[i][l] = 0
                
        # print(matrix)
        

# matrix = [[1,1,1],[1,0,1],[1,1,1]]
matrix = [[0,1,2,0],[3,4,5,2],[1,3,0,5],[1,3,1,5],[0,3,1,5],[1,3,1,5],[1,3,1,5]]
Solution.setZeroes(matrix)
class Solution:
    def setZeroes(matrix):
        """
        Do not return anything, modify matrix in-place instead.
        """
        hang = list()
        lie = list()
        for i in range(len(matrix)):
            y = 0  # 列
            for j in matrix[i]:
                if j == 0:
                    hang.append(i)
                    lie.append(y)
                y += 1

        hang = list(set(hang))
        lie = list(set(lie))
        
        matrix_trans = list(map(list, zip(*matrix)))  # 转置
        for l in lie:
            matrix_trans[l] = len(matrix_trans[l]) * [0]
        
        matrix = list(map(list, zip(*matrix_trans)))  # 转置
        for h in hang:
            matrix[h] = len(matrix[h]) * [0]   
            
        print(matrix)

面试题 02.02. 返回倒数第 k 个节点 

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

class Solution:
    def kthToLast(self, head: ListNode, k: int) -> int:
        count = 0
        p = head
        while p:
            count += 1
            p = p.next
        for i in range(0, count - k):
            head = head.next
        return head.val

python位运算

异或:如果同一位的数字不同则为 1,相同则为 0。

  1. 任何数和本身异或则为 0
  2. 任何数和 0 异或是 本身
  3. 异或满足交换律。 即 a ^ b ^ c ,等价于 a ^ c ^ b

剑指 Offer 65. 不用加减乘除做加法 

int add(int num1, int num2)
{
    int tmp1 = num1^num2;
    int tmp2 = (num1&num2)<<1;
    while(tmp2)
    {
        num1 = tmp1^tmp2;
        num2 = (tmp1&tmp2)<<1;
        tmp1= num1;
        tmp2= num2;
     }
     return tmp1;
}

原理分析:

以63加1为例,如下程序打印了位运算的过程(tmp1 和  tmp2 的二进制值):

tmp1用来存放两个数相加(不进位)的结果,tmp2用来存放两个数相加的进位。那么number1加number2即可等效为tmp1加tmp2,由于tmp2是通过或运算再移位得来的,最终一定为为零,那么tmp1就是我们求的两数相加结果。

python3:

class Solution:
    def add(self, a: int, b: int) -> int:
        num1 = (a^b)&0xFFFFFFFF #step1:相加但不计进位的结果,因python无位数限制,在此将其限定在32位
        num2 = ((a&b)<<1)&0xFFFFFFFF #step2:求出进位结果,并将其转成32位
        while(num2): #step3:当有进位时,需要将step1和step2的结果继续相加,即重复step1和stwp2.
            a = (num1^num2)&0xFFFFFFFF
            b = ((num1&num2)<<1)&0xFFFFFFFF
            num1 = a
            num2 = b
        return num1 if num1<=0x7FFFFFFF else ~(num1^0xFFFFFFFF)

# 注意:8位可以表示的数值范围在 -128到+127,即(100000000-01111111),第一位是符号位。
# 所以32位可以表示的数值范围在 1000 0000 0000 0000 0000 0000 0000 0000到0x7FFFFFFF,即-2147483648到2147483647
# 但是python没有位数限制,即不存在最高位溢出,不会将表示负数的最高位‘1’认为是符号位,所以会将1000 0000 0000 0000 0000 0000 0000 0000认为是2147483648。
# 因此需要进行越界检查,将负数进行相应处理: ~(num1^0xFFFFFFFF)

参考:https://www.cnblogs.com/wmlj/p/10388270.html

136. 只出现一次的数字

题目大意是除了一个数字出现一次,其他都出现了两次,让我们找到出现一次的数。我们执行一次全员异或即可。

class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        temp = sum(set(nums))*2
        return temp-sum(nums)

上述方法都具有线性时间复杂度。需要额外使用 O(n) 的空间,其中 n 是数组长度。

位运算 

class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        return reduce(lambda x, y: x ^ y, nums)
def singleNumber(self, nums: List[int]) -> List[int]:
    x = 0
    for num in nums:  # 1. 遍历 nums 执行异或运算
        x ^= num      
    return x;         # 2. 返回出现一次的数字 x

作者:jyd
链接:https://leetcode-cn.com/problems/shu-zu-zhong-shu-zi-chu-xian-de-ci-shu-lcof/solution/jian-zhi-offer-56-i-shu-zu-zhong-shu-zi-tykom/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

137. 只出现一次的数字 II

题目大意是除了一个数字出现一次,其他都出现了三次,让我们找到出现一次的数。 灵活运用位运算是本题的关键。

class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        res = 0
        for i in range(32):
            cnt = 0  # 记录当前 bit 有多少个1
            bit = 1 << i  # 记录当前要操作的 bit
            for num in nums:
                if num & bit != 0:
                    cnt += 1
            if cnt % 3 != 0:
                # 不等于0说明唯一出现的数字在这个 bit 上是1
                res |= bit

        return res - 2 ** 32 if res > 2 ** 31 - 1 else res

剑指 Offer 56 - I. 数组中数字出现的次数

260. 只出现一次的数字 III(同解)

题目大意是除了两个数字出现一次,其他都出现了两次,让我们找到这个两个数。要求:时间复杂度O(N) ,空间复杂度 O(1) 的解法。

Picture2.png

class Solution:
    def singleNumbers(self, nums: List[int]) -> List[int]:
        x, y, n, m = 0, 0, 0, 1
        for num in nums:         # 1. 遍历异或
            n ^= num
        while n & m == 0:        # 2. # m 循环左移一位,直到 n & m != 0
            m <<= 1       
        for num in nums:         # 3. 遍历 nums 分组
            if num & m: x ^= num # 4. 当 num & m != 0
            else: y ^= num       # 4. 当 num & m == 0
        return x, y              # 5. 返回出现一次的数字

645. 错误的集合

空间复杂度 O(1) 的解法

class Solution:

    def findErrorNums(self, nums: List[int]) -> List[int]:
        ret = 0  # 所有数字异或的结果
        a = 0
        b = 0
        for n in nums:
            ret ^= n
        for i in range(1, len(nums) + 1):
            ret ^= i
        # 找到第一位不是0的
        h = 1
        while(ret & h == 0):
            h <<= 1
        for n in nums:
            # 根据该位是否为0将其分为两组
            if (h & n == 0):
                a ^= n
            else:
                b ^= n
        for n in range(1, len(nums) + 1):
            # 根据该位是否为0将其分为两组
            if (h & n == 0):
                a ^= n
            else:
                b ^= n
        for num in nums:
            if a == num:
                return [a, b]
            if b == num:
                return [b, a]

作者:fe-lucifer
链接:https://leetcode-cn.com/problems/shu-zu-zhong-shu-zi-chu-xian-de-ci-shu-lcof/solution/zhi-chu-xian-yi-ci-de-shu-xi-lie-wei-yun-suan-by-a/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

190. 颠倒二进制位

class Solution:
    def reverseBits(self, n: int) -> int:
        res = 0
        for i in range(32):
            res = (res << 1) | (n & 1)
            n >>= 1
        return res

思路: 

   n      res
11001001  -
1100100   1
110010    10
(res << 1) | (n & 1)
n >>= 1

191. 位1的个数

class Solution:
    def hammingWeight(self, n: int) -> int:
        ret = sum(1 for i in range(32) if n & (1 << i)) 
        return ret

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
城市应急指挥系统是智慧城市建设的重要组成部分,旨在提高城市对突发事件的预防和处置能力。系统背景源于自然灾害和事故灾难频发,如汶川地震和日本大地震等,这些事件造成了巨大的人员伤亡和财产损失。随着城市化进程的加快,应急信息化建设面临信息资源分散、管理标准不统一等问题,需要通过统筹管理和技术创新来解决。 系统的设计思路是通过先进的技术手段,如物联网、射频识别、卫星定位等,构建一个具有强大信息感知和通信能力的网络和平台。这将促进不同部门和层次之间的信息共享、交流和整合,提高城市资源的利用效率,满足城市对各种信息的获取和使用需求。在“十二五”期间,应急信息化工作将依托这些技术,实现动态监控、风险管理、预警以及统一指挥调度。 应急指挥系统的建设目标是实现快速有效的应对各种突发事件,保障人民生命财产安全,减少社会危害和经济损失。系统将包括预测预警、模拟演练、辅助决策、态势分析等功能,以及应急值守、预案管理、GIS应用等基本应用。此外,还包括支撑平台的建设,如接警中心、视频会议、统一通信等基础设施。 系统的实施将涉及到应急网络建设、应急指挥、视频监控、卫星通信等多个方面。通过高度集成的系统,建立统一的信息接收和处理平台,实现多渠道接入和融合指挥调度。此外,还包括应急指挥中心基础平台建设、固定和移动应急指挥通信系统建设,以及应急队伍建设,确保能够迅速响应并有效处置各类突发事件。 项目的意义在于,它不仅是提升灾害监测预报水平和预警能力的重要科技支撑,也是实现预防和减轻重大灾害和事故损失的关键。通过实施城市应急指挥系统,可以加强社会管理和公共服务,构建和谐社会,为打造平安城市提供坚实的基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值