Q. 反转链表(深信服、雷火)
两个指针
递归
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. 给定一个数组,输出所有它的全排列组合(字节)
Q. 最大矩形(字节)
Q. 数组中第k大的元素(字节)
Q. 两个数组的交集(字节)
Q. 分割回文串(字节)
Q. 滑动窗口的最大值(字节)
Q. 最大最小值(字节)
Q. 最长公共子序列(字节)
两句话解决:
- 如果两个字母不同,就选择上方和左方邻居格子中较大的那个值
- 如果两个字母相同,值为左上方格子中的值加一
Q. 有效括号(字节)
Q. 二叉树的直径(字节)
Q. 一个链表,奇数下标递增,偶数下标递减,使其总体递增
- 第一个方法:
把链表转成数组,sort() 之后再转成链表 - 第二个方法:
把链表拆成两个子链表,递增的子链表不作处理,递减的子链表进行翻转操作,然后再合并两个子链表
Q. 合并两个有序链表
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缓存机制实现(字节)
Q. 二叉树的完全性检验(字节)
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
无序的时候就打表,如果某个节点的值出现过了,就将这个点删掉