这里写目录标题
字节跳动面经中的算法题
1 用数组或链表实现FIFO的get和add方法 (*)
原理就是利用链表实现队列。
get() 方法就是获取链表的头结点的内容;
add() 方法需要维持一个指针,一直指向链表的表尾,然后进行插入节点。
struct ListNode{
int val;
ListNode *next;
ListNode(int x):val(x),next(NULL){
}
ListNode(){
}
};
ListNode *p1;
int get(){
return p1->val;
}
void add(int x){
ListNode *p2=p1;
while (p2->next!=NULL){
p2=p2->next;
}
p2->next=new ListNode(x);
}
2 链表反转(**)
/*反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
* */
ListNode* revrse(ListNode* head){
if(head==NULL) return NULL;
ListNode *pre=NULL;
ListNode *curr=head;
while (curr!=NULL){
ListNode *temp=curr->next;
curr->next=pre;
pre=curr;
curr=temp;
}
return pre;
}
3 最大正方形(*)
给定的m * n二维数组只含有0或者1,求包含1的最大正方形面积。
例如:
1 0 1 0 0
1 0 1 1 0
1 0 1 1 1
1 0 1 1 1
上例最大正方形面积为4
int maximalSquare(vector<vector<char>>& matrix) {
//用动态规划,开动规数组dp[i][j]表示以位置(i,j)为正方形的右下顶点时所构成的最大边长
//有状态转移方程dp[i][j] = min(dp[i][j - 1], dp[i - 1][j], dp[i - 1][j - 1]) + 1
if (matrix.empty()) return 0;
int m = matrix.size(), n = matrix[0].size();
int res = 0;
vector<vector<int> > dp(m, vector<int>(n));
if (matrix[0][0] == '0') dp[0][0] = 0;
else dp[0][0] = 1;
res = dp[0][0] * dp[0][0];
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
if (i == 0 && j == 0) continue;
else if (i == 0 || j ==0) dp[i][j] = matrix[i][j] == '1' ? 1 : 0;
else dp[i][j] = matrix[i][j] == '1' ? min(dp[i][j - 1], min(dp[i - 1][j], dp[i - 1][j - 1])) + 1 : 0;
res = max(res, dp[i][j] * dp[i][j]);
}
}
return res;
}
4 括号匹配
利用栈可以很容易地解决这个问题,在遍历字符串时,若当前位置是右侧符号,那它需要一个该位置之前最近的一个符号为左侧符号,否则不匹配。定义一个栈,用以记录遍历到当前位置时,所遇到的左侧符号,处理方式是这样的,每当遇到一个右侧符号时,检查栈是否为空,若此时栈不为空,则对栈进行pop操作表明顶部元素已被匹配,否则为不匹配情况,直接返回false。当整个字符串遍历结束,我们就可以通过判断该栈是否为空来判断整个字符串中的符号是否匹配。
bool ismatch(string &str){
if(str.size()==0) return false;
stack<char> s;
int count=0;
for(int i=0; i<str.size(); i++){
char c=str[i];
if(c=='('){
s.push(c

这篇博客汇总了字节跳动面试中出现的算法题目,包括链表操作、二维数组问题、括号匹配、排序算法、二叉树问题、浮点数处理等,涵盖了数据结构和算法的多个方面。

1622

被折叠的 条评论
为什么被折叠?



