编程题 面经(未完待更)

Q. 反转链表(深信服、雷火)

两个指针
在这里插入图片描述

递归

在这里插入图片描述
LeetCode 206 - 反转链表

Q. 给了一个字符数组,求这些数组的组合,例如{a,b,c}的答案是{a,b,c,ab,ac,bc,abc}(字节)

ans = []

def helper(l, p, prefix):
    ans.append(prefix)
    while p < len(l):
        pre = ''
        pre = prefix+l[p]
        p += 1
        helper(l,  p, pre)
    return ans 

Q. 寻找唯一不重复的数字(鹅厂、字节)

面试-找唯一不重复的元素(鹅厂)

Q. 给定一个数组,输出所有它的全排列组合(字节)

LeetCode 46 - 全排列

Q. 最大矩形(字节)

LeetCode 85 - 最大矩形

Q. 数组中第k大的元素(字节)

LeetCode 215 - 数组中第k大的元素

Q. 两个数组的交集(字节)

LeetCode 349 - 两个数组的交集

Q. 分割回文串(字节)

LeetCode 132 - 分割回文串 II

Q. 滑动窗口的最大值(字节)

LeetCode 239 - 滑动窗口最大值

Q. 最大最小值(字节)

面试 - 最大值最小化(字节)

Q. 最长公共子序列(字节)

两句话解决:

  • 如果两个字母不同,就选择上方和左方邻居格子中较大的那个值
  • 如果两个字母相同,值为左上方格子中的值加一

LeetCode 1143 -最长公共子序列

Q. 有效括号(字节)

Q. 二叉树的直径(字节)

LeetCode 543 - 二叉树的直径

Q. 一个链表,奇数下标递增,偶数下标递减,使其总体递增

  • 第一个方法:
    把链表转成数组,sort() 之后再转成链表
  • 第二个方法:
    把链表拆成两个子链表,递增的子链表不作处理,递减的子链表进行翻转操作,然后再合并两个子链表

Q. 合并两个有序链表

LeetCode 21 - 合并两个有序链表

Q. 给一个数组,求其所有数都平方后,共有多少个唯一的值(字节)

使用双指针,从两边向中间扫描。将绝对值大的数字删掉,计数即可,并记录刚才删除的数值的绝对值,以免出现多次相同的数据,重复计数的问题。

def CountSquareNumber(nums):
    left, right, cnt, pre = 0, len(nums) - 1, 0, float('inf')
    while left <= right:
        if abs(nums[left]) > abs(nums[right]):
            if pre != abs(nums[left]):
                cnt += 1
                pre = abs(nums[left])
            left += 1
        else:
            if pre != abs(nums[right]):
                cnt += 1
                pre = abs(nums[right])
            right -= 1
    return cnt

Q. LRU缓存机制实现(字节)

LeetCode 146 - LRU缓存机制

Q. 二叉树的完全性检验(字节)

LeetCode 958 - 二叉树的完全性检验

Q. 用两个互斥锁实现读写锁(鹅厂)

清楚认识到读写锁分为共享锁(读锁)和独占锁(写锁),可能通过设置标志位记录读锁调用的次数结合互斥锁实现共享锁。

#include<pthread.h>
 
pthread_mutex_t rdLock = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t wrLock = PTHREAD_MUTEX_INITIALIZER;
int readCnt = 0;//设置读锁调用次数的标志位
 
//实现读锁(共享锁)
void rdLock() {
	pthread_mutex_lock(&rdLock);
	readCnt++;
	if (readCnt == 1)//有人读,于是阻塞写锁
		pthread_mutex_lock(&wrLock);
	pthread_mutex_unlock(&rdLock);
}
 
void rdUnlock() {
	pthread_mutex_lock(&rdLock);
	readCnt--;
	if (readCnt == 0)//表示已没有人在读,释放写锁,可以写入了
		pthread_mutex_unlock(&wrLock);
	pthread_mutex_unlock(&rdLock);
}
 
void wrLock() {
	pthread_mutex_lock(&wrLcok);
}
 
void wrUnlock() {
	pthread_mutex_unlock(&wrLock);
}

Q. 链表去重(鹅厂)

分两种情况:

(1)输入链表有序,如 2 − > 3 − > 3 − > 4 − > 5 − > 5 − > 5 − > 6 2->3->3->4->5->5->5->6 2>3>3>4>5>5>5>6

有序的时候用双指针

(2)输入链表无序,如 2 − > 5 − > 3 − > 7 − > 5 − > 6 − > 9 − > 3 2->5->3->7->5->6->9->3 2>5>3>7>5>6>9>3

无序的时候就打表,如果某个节点的值出现过了,就将这个点删掉

Q. 每个数组里选择一个元素求所有的组合(鹅厂)

面试 - 每个数组里选择一个元素求所有的组合(鹅厂)

Q. n个节点的二叉树的最大最小深度(鹅厂)

Q. 二叉树公共祖先(鹅厂)

Q. 压缩算法(鹅厂)

面试 - 压缩算法(鹅厂)

Q. 翻转数列(鹅厂)

面试 - 翻转数列(鹅厂)

Q. 子数组的最小值之和(鹅厂)

LeetCode 907 - 子数组的最小值之和

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值