日常刷题(14)

1. 两数之和绝对值最小

1.1. 题目描述

给定一个从小到大的有序整数序列(存在正整数和负整数)数组 nums ,请你在该数组中找出两个数,其和的绝对值(|nums[x]+nums[y]|)为最小值,并返回这个绝对值。
每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。

1.2. 输入描述

一个通过空格分割的有序整数序列字符串,最多1000个整数,且整数数值范围是 -65535~65535。

1.3. 输出描述

两数之和绝对值最小值

1.4. 用例

输入 -3 -1 5 7 11 15
输出 2
说明 因为 |nums[0] + nums[2]| = |-3 + 5| = 2 最小,所以返回 2。

1.5. 题目解析

双指针应该就可以了。二分查找或许可以用,但是我没想好怎么设计

1.6. 代码

class Solution:
    def __call__(self, nums: List[int]):
        nums.sort()
        left, right = 0, len(nums) - 1

        ans = float('inf')

        while left < right:
            lval, rval = nums[left], nums[right]
            _ans = (lval + rval)
            ans = min(abs(_ans), ans)

            if _ans < 0:
                left += 1

            else:
                right -= 1
        return ans

2. 螺旋数字矩阵

2.1. 题目描述

疫情期间,小明隔离在家,百无聊赖,在纸上写数字玩。他发明了一种写法:

给出数字个数 n (0 < n ≤ 999)和行数 m(0 < m ≤ 999),从左上角的 1 开始,按照顺时针螺旋向内写方式,依次写出2,3,…,n,最终形成一个 m 行矩阵。

小明对这个矩阵有些要求:

每行数字的个数一样多
列的数量尽可能少
填充数字时优先填充外部
数字不够时,使用单个 * 号占位

2.2. 输入描述

两个整数,空格隔开,依次表示 n、m

2.3. 输出描述

符合要求的唯一矩阵

2.4. 用例

输入 9 4
输出
1 2 3
* * 4
9 * 5
8 7 6

说明 9个数字写出4行,最少需要3列
输入 3 5
输出
1
2
3
*
*
说明 3个数字写5行,只有一列,数字不够用*号填充

输入 120 7
输出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 19
45 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 63 20
44 83 114 115 116 117 118 119 120 * * * * * * 99 64 21
43 82 113 112 111 110 109 108 107 106 105 104 103 102 101 100 65 22
42 81 80 79 78 77 76 75 74 73 72 71 70 69 68 67 66 23
41 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24
说明 无

2.5. 题目解析

明确一下思路,就是先画个星号图,然后从左上角开始,填数字、找下个位置、填数字、找下个位置。

2.6. 代码

class Solution:
    def __call__(self, nums: int, rows: int):
        def get_next_pos(pos):
            x, y = pos
            di, dj = dir_map[0]
            _i, _j = x + di, y + dj
            try:
                assert result[_i][_j] == '*'
                return _i, _j
            except Exception:
            	# 碰壁了就换方向
                dir_map.append(dir_map.pop(0))
                return get_next_pos(pos)

        dir_map = [
            (0, 1),
            (1, 0),
            (0, -1),
            (-1, 0)
        ]

        cols = nums // rows + (nums % rows > 0)  # 向上取整
        result = [['*'] * cols for _ in range(rows)]

        i, j = (0, 0)  # 左上角开始
        for num in range(1, nums + 1):
            result[i][j] = str(num)  # 填数字
            i, j = get_next_pos((i, j))  # 找下一格
        return result
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值