算法刷题的输入问题以及哈希表查找

前段时间参加笔试在数据输入问题上卡了好长时间,大厂笔试“缺德”,不像Leetcode的那么友好自动输入验证。

  1. 单数字输入
# 单个整数输入
a = int(input()) # 一个整数
'''
例如
>>>a = int(input())
>>>5
>>>a = 5
'''

# 两个数怎么办?
a, b = map(int, input().split())  # split() 括号空->空格分隔,','->逗号分隔
'''
例如
>>>a, b = map(int, input().split()) 
>>>1 2
>>>a = 1, b = 2
'''
# 需要多个数字,那就在a,b之后加

# 想输入数组怎么办?
nums = list(map(int, input().split())
'''
例如:
>>>nums = list(map(int, input().split())
>>>1 2 3 4 5
>>>nums = [1,2,3,4,5]
'''
  1. 字符串的输入
 s = input()
  1. 多行的数字输入
nums = []
for i in range(n):
    nums.append(int.input())

例如:leetcode上的一道题对一个[[2],[3,4],[6,5,7],[4,1,3,7]],只有相邻的节点之间可以运算,最后求最小路径。

# 输入
nums = []
for i in range(4):
    nums.append(list(map(int,input().split())))
res = Solution().function(nums)

思路:如上所示,从上向下计算寻找最小和形势并不明显。但是从下向上就不一样了,所以选择从上计算。整个数组里包含两个维度,第一个深度n=len(nums),第二个n行中的元素个数。也就是说时间复杂度O(n²)

class Solution:
    def function(self, nums):
        n = len(nums)
        mid = nums[-1]
        for i in range(n-2, -1, -1):
            for j in range(i+1):
                # 最底层不需要计算,倒数第二层[6,5,7]需要更新
                mid[j] = nums[i][j] + min(mid[j], mid[j+1])
        return mid[0]

[6,5,7]这列更新的数:
ans[2][0] = nums[2][0] +min(ans[-1][0], ans[-1][1])
ans[2][1] = nums[2][1] +min(ans[-1][1], ans[-1][2])
ans[2][2] = nums[2][2] +min(ans[-1][2], ans[-1][3])
由于在程序中
mid[j] = nums[i][j] + min(mid[j], mid[j+1])
等号左的mid[j]是等待更新的[6,5,7]这一层;
等号右的mid[j],mid[j+1]是表示mid[-1][j],mid[-1][j+1]

nums = [1,2,3,1,2,1,3,2,2,2]
dict = {}
for i in nums:
    dict[i] = dict.get(i, 0) + 1  # 传入到哈希表中

# 字典关键字查找, 通过key查找value,或者通过value查找key
for key, value in dict.items():
    if key == XXX:
        print(value)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值