常见笔试编程数据结构(一)~ 数组与矩阵类

数组与矩阵

* EASY

1 挖雷游戏

题目: 程序接收三个参数,M,N和p,然后生成一个M * N的矩阵,然后每一个cell有p的概率是地雷。生成矩阵后,再计算出每一个cell周围地雷的数量.

思路: 创建(m+2)*(n+2)的矩阵,若value[i][j]<p则赋值-1(雷),否则0;计算每个非雷区附近8个格子中有雷的个数range(1,m+1)*range(1,n+1)

2 矩阵0变换

题目: 给一个m×n的矩阵,如果有一个元素为0,则把该元素对应的行与列所有元素全部变成0.

思路: 创建数组m和n,遍历整个矩阵凡是遇到0则m[i]=n[j]=0,再遍历一次矩阵,if(m[i]==0 or n[j]==0):matrix[i][j]=0

3 旋转数组

题目: 给一个n×n的数组,旋转90度.

思路: 一层一层从外到内的旋转,for layer in range(n//2):first=layer/ last=n-1-layer/ for i in range(first,last):offset=i-first/ top=matrix[first][i]…

4 反转字符串

题目: hello => olleh.

思路: s[i],s[n-1-i]=s[n-1-i],s[i]

5 最大数

题目: 给定一个数组,数组里有且只有一个最大数,判断这个最大数是否是其他所有数的两倍或更大。如果存在这个数,则返回其index,否则返回-1.

思路: 只要比较max≥2*second_max

6 Plus One

题目: 给定非空数组,正整数,一位数 例:输入【1,2,3】->[1,2,4],输入【9,9,9】->[1,0,0,0].

思路: 从后往前遍历,若不是9则+1且break;否则为0继续遍历

7 移动数组(leecode189)

题目: 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。(原地转移).

思路: nums[:k],nums[k:]=nums[len(nums)-k:],nums[:len(nums)-k]

8 移动零(leetcode283)

题目: 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 示例: 输入: [0,1,0,3,12] 输出: [1,3,12,0,0](必须在原数组上操作,不能拷贝额外的数组).

思路: 每碰到一个0则记下count,下一个非零数时将其往前移count位,最后将数组最后count个数赋值为0

9 重塑矩阵(leetcode 566)

题目: 改变矩阵维度实现reshape;如果具有给定参数的reshape操作是可行且合理的,则输出新的重塑矩阵;否则,输出原始矩阵.

思路: 创建两个空数组,一个将原数组变为一维,另一个负责将一维数组中的元素按行按列装进去

10 最大连续1的个数(leetcode 485)

题目: 给定一个二进制数组, 计算其中最大连续1的个数。例[1,0,1,1,1,0,1,1]->3.

11 错误的集合( leetcode 645)

题目: 一个数组元素在 [1, n] 之间,其中一个数被替换为另一个数,找出重复的数和丢失的数.

思路: 创建0值数组,将原始数组以(值-1)为索引将应有数字的负值填入,若填进去时已有值,则*(-1)如[3,2,3,4]->[0,0,0,0]-[0,-2,3,-4],此时得到的新数组不仅排好序,而且lost为0位置应有值,dup为正数处应有值

12 数组的度(leetcode 697)

题目: 给定一个非空且只包含非负数的整数数组 nums, 数组的度的定义是指数组里任一元素出现频数的最大值.你的任务是找到与 nums 拥有相同大小的度的最短连续子数组,返回其长度. 输入: [1,2,2,3,1,4,2]输出: 6

思路: 1.创建dic=defaultdict(list)记录每种数字有哪些索引 2.计算索引数最多的则为maxlen=max(len(value) for value in dic.values()) 3.求拥有maxlen的数字的索引列表尾数与头数之差的最小值

13 托普利茨矩阵(leetcode 766)

题目: 如果一个矩阵的每一方向由左上到右下的对角线上具有相同元素,那么这个矩阵是托普利茨矩阵。给定一个 M x N 的矩阵,当且仅当它是托普利茨矩阵时返回 True.
输入:
matrix =
[[1,2,3,4],
[5,1,2,3],
[9,5,1,2]]
输出: True

思路: 只看对角线,1. 固定col为0,row从 1 到 M - 1沿着对角线向右下比较(左下部分的处理) 2. if M > 1:固定row为0,col从 1 到 N - 1沿着对角线向右下比较(右上部分的处理)

* ADVANCED

240 / 378 / 287 / 667 / 565 / 769
持续更新

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值