2019年9月3日 近期的一些笔试题目

321 阅读3分钟

瓜子笔试

填空题

首先,将瓶子的10进制编号数改成9位的2进制码。然后,让第1只老鼠喝所有2进制码第1位是1的瓶子中的水;让第2只老鼠喝所有2进制码第2位是1的瓶子中的水;以此类推下去。这样,每个老鼠第二天的死活情况就决定了毒水瓶子二进制码这一位的数字:老鼠死,对应1,反之为0。换言之,将9只老鼠死活情况排成一排。比如说结果是“死活死死活活死死死”的话,毒水瓶子的二进制标签就是:101100111,转换成10进制,得到瓶子的标签。
如果是12个点,正常的话,可以组成12*11/2 = 66 条直线,现在是59条,所以是有多点共线的。三点共线少了3-1=2条直线,四点共线少了6-1=5条直线,所以12个点中有三个点共线和四个点共线各一种的情况。12个点可以组成的三角形是220种,其中三点共线少了1一种三角形,4点共线少了4种三角形,所以答案是220-1-4=215个。

笔试题

LeetCode41 缺失的第一个正数

思路:解题思路很巧妙。本题的思路是从前往后将数放到它正确的位置上去。

举个例子,假设有序列[4,2,6,1,-3],首先看第一个数4,它正确的位置应该是在序列的第4个位置(位置数从1开始,正确的位置是第一个位置放1,第二个位置放2,第三个位置放3……最后我们只要看哪个位置放的不是理想的数,那么它就是第一个缺失的正数)。我们将4与第4个位置上的“1”进行交换,序列变成[1,2,6,4,-3];接着我们还是看第一个数,现在变成了“1”,它的确在它正确的位置,好了,我们再看第二个数2,也在正确的位置。第三个数6,本来应该放在第6个位置,可是该序列总共就5个位置,所以不移动;第四个数4在它的正确位置,不动;第五个数是负数,不动。最后,从前往后看,发现在第三个位置本该出现的3没有出现,所有该序列缺失的第一个正数是3。

所以归纳来说,将每个数放在它正确的位置,前提是该数是正数,并且该数小于序列长度,并且它正确位置上的那个数不是它,也就是说,把4要放在第4个位置,要保证第4个位置上的数不是4,如果是4的话,交换前后没什么变换,把两个4移来移去,还会造成死循环。

class Solution:
    def firstMissingPositive(self, nums: List[int]) -> int:
        for i in range(len(nums)):
            while nums[i] > 0 and nums[i]<len(nums) and nums[nums[i]-1] != nums[i]:
                nums[nums[i]-1], nums[i] = nums[i] ,nums[nums[i]-1]
        for i in range(len(nums)):
            if nums[i] != i+1:
                return i+1
        return len(nums)+1

LeetCode 75 颜色分类(荷兰国旗问题)

我们将数组分为四组:红色,白色,非分类和蓝色。最初,我们将所有元素分组为非分类。只要白色指针小于蓝色指针,我们就从头开始迭代。

如果白色指针为红色(nums [white] == 0),我们用红色指针交换并向前移动白色和红色指针。如果指针是白色的(nums [white] == 1),则元素已经在正确的位置,因此我们不必交换,只需向前移动白色指针。如果白色指针为蓝色,我们将交换最新的未分类元素。

class Solution(object):
    def sortColors(self, nums):
    
        red, white, blue = 0, 0, len(nums) - 1
 
        while white <= blue:
            if nums[white] == 0:
                nums[red], nums[white] = nums[white], nums[red]
                white += 1
                red += 1
            elif nums[white] == 1:
                white += 1
            else:
                nums[white], nums[blue] = nums[blue], nums[white]
                blue -= 1