2019拼多多提前批算法岗笔试

代码用python 实现,总共四道题,这里有三道题的答案,其中第一道考试时100%通过,第二、三题是下来自己写的,没经过线上环境测试,但是感觉思路是没问题的。

第一题
这里写图片描述
这里写图片描述
这里写图片描述

import sys
if __name__ == '__main__':
    line = sys.stdin.readline().strip()
    k = len(line) // 4
    line1 = line[0:k + 1]
    line2 = line[k + 1:2 * k]
    line3 = line[2 * k:3 * k + 1]
    line4 = line[3 * k + 1:]
    res = [[' '] * (k + 1) for i in range(k + 1)]
    for i in range(k + 1):
        res[0][i] = line1[i]
        res[k][i] = line3[k - i]
    for i in range(1, k):
        res[i][0] = line4[k - i - 1]
        res[i][k] = line2[i - 1]
    for i in res:
        print(''.join(i))

第二题
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

思路
1. 分割后的arr头尾不能同时是0
2. 如果分割后的arr头部为0,则必须在第一个0后加小数点,仅1种;
如果分割后的arr尾部为0,则不能在任何位置加小数点,仅1种
3. 分割后的arr非上诉情况,则小数点加在中间任意位置都可,有 len(arr)-1 种

def judge(arr): # arr头尾同时是0,则返回0,否则返回1
    flag = 1
    if len(arr)>1:
        flag = int(arr[0]) | int(arr[-1])
    return flag

def coutJudge(arr):
    if arr[0] == '0':
        return 0
    elif arr[-1] == '0':
        return 0
    else:
        return len(arr)-1

if __name__ == '__main__':
    arr = sys.stdin.readline().strip()
    num = 0
    for i in range(len(arr)-1):
       arr1 = arr[:i+1]
       arr2 = arr[i+1:]
       if judge(arr1) & judge(arr2): # 分割后的两个数组都必须满足头尾不能同时是0
           num += 1
           num += coutJudge(arr1)
           num += coutJudge(arr2)
    print(num)

第三题
这里写图片描述
这里写图片描述
这里写图片描述

思路
定义一个二维list:arr 来存储输入数组
1. 从arr 中取出给定用户的朋友列表arr0
2. 将所有用户列表于上诉列表做差集,并去除给定的用户自身,即得到给定用户的非朋友列表arr2
3. 循环遍历arr2,取arr0与arr[i]的交集元素个数(i 表示用户编号),存入字典,key:个数 value:i
4. 取字典最大的key,同时取该key对应的最小的value

import sys
def findFriend():
    line1 = sys.stdin.readline().split()
    line1 = list(map(int, line1))  # 第一行存到 line1 中,line[0]:第一行第一个数,line[1]:第一行第二个数
    arr = []  # 用arr[] 来保存输入的数组
    for i in range(line1[0]):
        line2 = sys.stdin.readline().split()
        line2 = list(map(int, line2))
        arr.append(line2)

    arr0 = arr[line1[1]]  # 给定用户的朋友列表
    arr1 = [i for i in range(line1[0])]  # 所有用户
    arr2 = [i for i in arr1 if i not in arr0]
    arr2.remove(line1[1])  # arr2 表示不是选定用户的朋友列表

    dict1 = {}  # key: 共同朋友的个数 value:用户编号
    for i in arr2:
        inter = [j for j in arr[i] if j in arr0]  # 取两个交集
        inter_len = len(inter)
        if inter_len in dict1.keys():
            dict1[inter_len].extend([i])
        else:
            dict1[inter_len] = [i]  # 这边的value 必须要写成list,这样后续才能extend()

    dict1_key = dict1.keys()
    if dict1_key:  # 如果有共同朋友
        print(min(dict1[max(dict1_key)]))  # 取最大的key对应的value,再对value取最小
    else:
        print(-1)

第四题
这里写图片描述
这里写图片描述

没啥好思路,欢迎讨论!

猜你喜欢

转载自blog.csdn.net/wlin_zzz/article/details/81566266