150分钟 四道手撕代码
1、设定如下的对应关系( A=1,B=2,C=3,...,Z=26,AA=27,AB=28,...,AAA=xxx,... ),
编写一个转换函数,根据上面的规则把一个字符串转换为数字
实现函数:
int StrToInt( const char * str );

def change(s):
    #相当于26进制求和
    ans=0
    for i in s:
        ans=26*ans+ord(i)-ord('A')+1
    return ans

print(change('AB'))

2、倒转单链表(在原链表上倒转)
struct LinkNode {
int value;
struct LinkNode * next;
};

实现函数:
struct LinkNode * reverseList( struct LinkNode * head );

class Node:
    def __init__(self,x):
        self.val=x
        self.next= None

class solution:
    def reverse(head:Node):
        dummy=Node(-1)
        dummy.next=head
        prev=dummy
        curr=head
        while curr:
            # 缓存curr的后驱节点
            tmp=curr.next
            # 反转currnext的指向
            curr.next=prev
            # 把prev和curr移到下一位
            prev=curr
            curr=tmp
        return dummy.next

3、给定一个数组,要求找出第二大的数并返回
int findSecond(int array[], int size);

def find(input,i,j):
    #以当前i位置为基准数,把大于input[i]的放在左边 小的放右边
    # ij分别为子段的首末两个idx
    x=input[i]
    while i<j:
        while i<j and input[j]<x:
            j-=1
        if i<j:
            input[i]=input[j]
            i+=1
        while i<j and input[i]>=x:
            i+=1
        if i<j:
            input[j]=input[i]
            j-=1
    return i

def findSecond(input):
    n=len(input)
    if n<2:
        return -1
    i=0
    j=n-1
    while True:
        #找到input[i]在序列中排第几大
        k=find(input,i,j)
        print(input)
        ##二分法缩小查找区间
        # mid=(i+j+1)//2
        #如果k大于2 说明它input[i]比第二大的数小,要从k左侧的数继续找
        #第二大的idx对应为2-1
        if k>2-1:
            j=k-1
        elif k<2-1:
            i=k+1
        else:
            return input[k]
print(findSecond([5,5,3,4,3,6]))

4、最长的彩虹子序列
彩虹子序列这样定义:
1)序列中有一个最大值
2)最大值的左边子序列严格递增
3)最大值的右边子序列严格递减
注意:子序列不一定连续

struct Result {
int len; // 序列的长度
};
实现函数:
int rainBow(int array[], int size, struct Result * result);

# 分两步 第一步从左往右找最长上升子序列 第二部从右往左找最长上升子序列(相当于把原序列反转)


def findLLongestAscend(array):
    #dp[i]存储array[0:i+1]序列中最长上升子序列的长度
    dp=[0]*len(array)
    dp[0]=1
    for i in range(1,len(array)):
        # 遍历当前位置i之前的
        for j in range(i):
            # 如果之前的有比当前array[i]小的话
            if array[j]<array[i]:
                #更新当前dp[i]的值
                dp[i]=max(dp[i],dp[j]+1)
    return dp

def find(input):
    dp1=findLLongestAscend(input)
    print(dp1)
    dp2=findLLongestAscend(input[::-1])
    dp2=dp2[::-1]
    print(dp2)
    ans=0
    for i in range(len(input)):
        #这里要-1 不然就把自己多算了一次
        ans=max(dp1[i]+dp2[i]-1,ans)
    return ans

print(find([1,2,3,2,1]))

5、项目相关
6、机器学习理论:提升树、残差神经网络中残差块的作用、bagging和boosting的区别
7、计算机基础知识
static函数、 UT8和UNICODE的区别、进程线程区别、虚函数在编译层面是怎么实现的;UDP和TCP的区别、三次握手和四次挥手