2021-08-10 str

int fib(int n) {
        if(n==0) return 0;
        if(n==1||n==2) return 1;
        int a=0,b=1,c=0;
        for(int i=0;i<n;i++){
            a=b,b=c;
            c=(a+b)%1000000007;
        }
        return c;
    }

10

int numWays(int n) {

        int a=0,b=1,c=1;//注意于fib的区别

        for(int i=0;i<n;++i){

            a=b,b=c;

            c=(a+b)%1000000007;

        }

        return b;//注意于fib的区别

    }

-------------

链表

    ListNode* reverseList(ListNode* head) {

        ListNode* pre=nullptr;

        ListNode* cur=head;

        ListNode* next=nullptr;

        while(cur){

            next=cur->next;//保存

            cur->next=pre;//反转

            pre=cur;//更新头节点

            cur=next;//移向下一个

        }

        return pre;//pre才是头节点

    }

--------------

11 二分查找

    int minArray(vector<int>& numbers) {

        //二分查找

        //二分之只能处理有序数组,这里是个旋转数组,变形的递增

        int low=0;

        int high=numbers.size()-1;

        while(low<high)

        {

            int mid = low + (high-low)/2;

            if(numbers[mid]<numbers[high]){

                high = mid;//我们在找最小值

            }

            else if(numbers[mid]>numbers[high]){

                low = mid+1;//前面的肯定是递增,都比high高只能往后找

            }

            else{

                high -= 1;

            }

        }

        return numbers[low];//找的最小值

    }

O(log n)

O(1)

-------------------

21 排序

    vector<int> exchange(vector<int>& nums) {

        int L=0;

        int R=nums.size()-1;

        while(L<R){

            while(R>=0&&nums[R]%2==0) --R;//从右边找奇数

            while(L<nums.size()&&nums[L]%2!=0) ++L;//从左边找偶数

            //我们想要奇数在左边

            if(L<R) swap(nums[R--],nums[L++]); 

        }

        return nums;

    }

----------------------

15 没啥东西,死记硬背

    int hammingWeight(uint32_t n) {

        int ret=0;

        while(n!=0){

            n=n&(n-1);

            ret++;

        }

        return ret;

    }

    /*

    15思路:一个不为零的数-1后,二进制原来最右边的1->0,其后所有0变为1,1保持不变。

    –->把一个整数-1,在和原来做and运算,会把整数最右的一个1变成0

    –->可以重复多少次,就有几个1

    */

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值