开发面试中的算法题

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

字节跳动面经中的算法题

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值