秋招编程题总结

笔试牛客里面的编程不会提示什么错误,如果出现通过80%的情况就需要自己试了

编程一般一题是20分,3题或者2题自己尽量做一题出来即可

人生就像是一场长跑,有很多机会,但也得看我们是否能够及时抓牢,就像下面这样的代码:

while(isRunning)
{
     if(...){...}
     else if(...){...}
     ...
     else{..}
}

      存在着太多的if...else if...else...,很多都是一闪而过,就看我们是否将isRunning时刻设置为true,一直不断在跑,一直不断在检查条件是否满足。就算条件达到了,有些人会选择return或者将isRunning设置为false,主动退出循环,有些人选择继续跑下去,不断追寻更高的目标。

1、将一个正整数分解质因数

质因数:质数+约数

10=2*5,数字5的处理

print本来是多行打印,需要一行打印,只需要在print中加入end=" "

{}的用法

def reduceNum(n):
    if not isinstance(n, int) or n <= 0 :
        exit(0)
    elif n in [1] :
        print("{}={}".format(n,n),end=" ")#1=1的写法
        exit(0)
    print("{}=".format(n), end=" ")
    while n not in [1] : # 循环保证递归
        for index in range(2, n + 1) :
            if n % index == 0:
                n =n// index # 必须要要用//,去除数的整数
                if n == 1: # This is the point
                    print (index,end=" ") #打印最后一个数
                    #lis.append(index)
                else : # index 一定是素数
                    print( '{} *'.format(index),end=" ")
                    #lis.append(index)
                break

reduceNum(1)

2、排序去重

set函数的使用,set的结果必须用list转化

先set,如果没list而直接sort会报错AttributeError: 'set' object has no attribute 'sort'(并且一定先set减少数据量,在sort,避免数据量过大)

join连接列表中元素时,一定要将列表中元素转化为str类型

3、n个数连成一排,求出其中最小的数

考虑情况:如:9和两位数32,此时9应该被排在前面

暴力解法:将所有数组合输出

①使用排列函数permutations(),必须导入迭代模块itertools。a = itertools.permutations(numbers)入口参数必须是列表,返回对象是元组

②三个数1,23,4,则组合元组有6种情况

import itertools
def PrintMinNumber1(numbers):
        result = []
        a = itertools.permutations(numbers)
        for each in a:
            tmp =""
            for i in each:
                tmp = tmp + str(i)
            result.append(tmp)
        return min(result)
n=int(input())
lis=[]
for i in range(n):
    lis.append(int(input()))
print(PrintMinNumber1(lis))

4、输入某年某月某日,判断这一天是这一年的第几天?

①只需要考虑月份对应的总天数+此月对应天数

②正常2月28天,闰年二月29天,闰年判断方法:能被100或4整除and能被400整除

year=int(input())
month=int(input())
day=int(input())
sum=day
days = [31,28,31,30,31,30,31,31,30,31,30,31]
i=0
if ( year%4 == 0 and year%100 != 0) or (year%400 == 0):#考虑闰年的情况,直接改变第二个月的值
    days[1] = 29
while i< month-1:#月份统计,i值不断增加
    sum=sum+days[i]
    i+=1
print(sum)

5、深度优先搜索 DFS 

6、走矩形的走法和路径足大值

4×5的数组从左上角到右下角的走法有多少种?程序怎么写?

排列组合角度考虑,只需要考虑在总的步数中往下走或者往右走多少步:

从左上角到右下角,总共需要走n+m-2步,左上角和右下角的元素不考虑在内,我们每次都可以选择向下走,向下走总共需要m-1步,所以在n+m-2步中选择m-1步,这是典型的排列组合问题

程序:直接将排列组合的表达式通过程序写出来

int uniquePaths(int m, int n)
{
    int N = n + m - 2;
    int K = n - 1;
    double res = 1.0;
    for (int i = 1; i <= n - 1; ++i)
    {
        res = res * (N - K + i) / i;
    }
    return (int)res;
}

如果有途中有障碍物:https://blog.csdn.net/sinat_35261315/article/details/78594116
问题拓展:4×4的四位数组,从左上角到右下角,实现路径上数字和最大/小

7、统计一个数二进制中1的个数,两数异或

8、找字符串中不重复的最大子串

def find_longest_no_repeat_substr(one_str):
    res_list = []
    length = len(one_str)
    for i in range(length):
        tmp = one_str[i]
        for j in range(i + 1, length):
            if one_str[j] not in tmp:
                tmp += one_str[j]
            else:
                break
        res_list.append(tmp)#将不重复的字符串全部存入列表中
    #res_list.sort(lambda x, y: cmp(len(x), len(y)))
    res_list.sort(key=lambda x: len(x))
    return res_list[-1]


if __name__ == '__main__':
    one_str_list = ['120135435', 'abdfkjkgdok', '123456780423349']
    for one_str in one_str_list:
        res = find_longest_no_repeat_substr(one_str)
        print(        '{0}最长非重复子串为:{1}'.format(one_str, res))

9、实现链表的反转

class Solution(object):
    def reverseList(self, head):
        if head == None:#head表示原链表的头节点。如果没有头节点,反转仍为空,返回空
            return []
        last_temp = None  #添加一个指针,初始化为空,用于反转后的最后一个节点。同时会在while中不断后移
        temp = head             #添加另一个指针
        while (temp != None):
            temp_next = temp.next#取出头节点的下一个节点
            temp.next = last_temp
            last_temp = temp
            temp = temp_next#指向头节点的指针现在指向第二个节点

        return last_temp

10、判断链表是否存在环状

def findbeginofloop(head):  # 判断是否为环结构并且查找环结构的入口节点
    slowPtr = head  # 将头节点赋予slowPtr
    fastPtr = head  # 将头节点赋予fastPtr
    loopExist = False  # 默认环不存在,为False
    if head == None:  # 如果头节点就是空的,那肯定就不存在环结构
        return False
    while fastPtr.next != None and fastPtr.next.next != None:  # fastPtr的下一个节点和下下个节点都不为空
        slowPtr = slowPtr.next  # slowPtr每次移动一个节点
        fastPtr = fastPtr.next.next  # fastPtr每次移动两个节点
        '''
        计算环长时
        slowstepnum += 1
        faststepnum += 2
        '''
        if slowPtr == fastPtr:  # 当fastPtr和slowPtr的节点相同时,也就是两个指针相遇了
            loopExist = True
            print("存在环结构")
            break
    # 环长 = fast走的步长 - slow走的步长

    if loopExist == True:
        slowPtr = head
        while slowPtr != fastPtr:
            fastPtr = fastPtr.next
            slowPtr = slowPtr.next
        return slowPtr#返回环的入口点

    print("不是环结构")
    return False

猜你喜欢

转载自blog.csdn.net/qq_20386411/article/details/82765615
今日推荐