瓜子二手车面试准备(leetcode,剑指offer)

本文探讨了位运算在计算二进制1的数目中的应用,以及如何利用链表处理两个链表的相交问题。同时,介绍了在矩阵中如何通过原地算法将元素为0的行和列置零的方法,最后讨论了二叉搜索树转换成双向链表的中序遍历技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 实现一个函数,能够计算整型十进制对应的二进制里的1的数目
    leetcode191

    思路:主要是利用位运算,整型数据与1相与,对应二进制末尾为0,则结果为0,末尾为1,则结果为1;无符号整型,>>运算符高位用0填充。
        int hammingWeight(uint32_t n) {//typedef unsigned long uint32_t;
            int count=0;
            while(n>0){
                if(n & 1) ++count;
                n=n>>1;
            }
            return count;
        }

    其实C++里面有相同功能的函数,__builtin_popcount(),用于计算无符号32位整数对应二进制里的1的个数,就在#incldue <iostream>头文件里。
     

    #include <iostream>
    using namespace std;
    
    int main(){
        int a=11;
        cout<<__builtin_popcount(a)<<endl;
        return 0;
    }

     

  2. 判断两个链表是否相交,并输出交点
    leetcode160

    执行用时 :104 ms, 在所有 C++ 提交中击败了31.64%的用户

    内存消耗 :16.6 MB, 在所有 C++ 提交中击败了63.67%的用户
    思路:首先判断是否有焦点,其次再找到焦点,这是贝壳面试时遇到的一个题目,很简单,但是刚才写的时候心里觉得简单就随便写,导致逻辑链丢失,代码也写了半个小时才写出来。

        ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
            if(headA==nullptr && headB==nullptr)
                return nullptr;
            ListNode *p1=headA;
            ListNode *p2=headB;
            int l1=1,l2=1;
            while(p1 && p1->next){
                p1=p1->next;
                ++l1;
            }
            while(p2 && p2->next){
                p2=p2->next;
                ++l2;
            }
            if(p1==p2 && p1){
                p1=headA;
                p2=headB;
                if(l1>l2){
                    for(int i=0;i<l1-l2;++i){
                        p1=p1->next;
                    }
                }else{
                    for(int i=0;i<l2-l1;++i){
                        p2=p2->next;
                    }
                }
                while(p1!=p2){
                    p1=p1->next;
                    p2=p2->next;
                }
                return p1;
            }else
                return nullptr;
        }

     

  3. 给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0。请使用原地算法
    leetcode73
    思路:
  4. 剑指offer27题,二叉搜索树转换成双向链表
    思路,借助中序遍历
    void inorder(BinaryTreeNode* *pList,BinaryTreeNode* root){
        if(root==nullptr)
            return;
        if(root->left){
            inorder(pList,root->left);
        }
        root->left=*pList;
        if(*pList!=nullptr){
            *pList->right=root;
        }
        *pList=root;
        if(root->right){
            inorder(pList,root->right);
        }
    }
    BinaryTreeNode* Convert(BinaryTreeNode* root){
        BinaryTreeNode* pList=nullptr;
        inorder(&pList,root);
        BinaryTreeNode* pListHead=pList;
        while(pListHead && pListHead->left){//需要返回头结点
            pListHead=pListHead->left;
        }
        return pListHead;
    }

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值