剑指 Offer 43. 1~n整数中1出现的次数;剑指 Offer 41. 数据流中的中位数;剑指 Offer 56 - I. - II. 数组中数字出现的次数

本文探讨了在数组中寻找唯一出现的数字的算法,包括寻找仅出现一次的两个数字和在其他数字出现三次背景下寻找单次出现的数字。通过实例展示了不同场景下算法的应用。

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

输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。

例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。

 

示例 1:

输入:n = 12
输出:5


示例 2:

输入:n = 13
输出:6

 

限制:


    1 <= n < 2^31

class Solution {
public:
    int countDigitOne(int n) {
       int count = 0;
       for(long i = 1;n/i;i*=10){//long i
            int left = n/i/10;
            int cur = n/i%10;
            int right = n-(n/i)*i;
            if(cur == 0)
                count += left * i;
            else if(cur == 1)
                count += left * i + right + 1;
            else 
                count += left * i + i;
       }
       return count;
    }
};

如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。

例如,

[2,3,4] 的中位数是 3

[2,3] 的中位数是 (2 + 3) / 2 = 2.5

设计一个支持以下两种操作的数据结构:


    void addNum(int num) - 从数据流中添加一个整数到数据结构中。
    double findMedian() - 返回目前所有元素的中位数。


示例 1:

输入:
["MedianFinder","addNum","addNum","findMedian","addNum","findMedian"]
[[],[1],[2],[],[3],[]]
输出:[null,null,null,1.50000,null,2.00000]


示例 2:

输入:
["MedianFinder","addNum","findMedian","addNum","findMedian"]
[[],[2],[],[3],[]]
输出:[null,null,2.00000,null,2.50000]

 

限制:


    最多会对 addNum、findMedia进行 50000 次调用。

class MedianFinder {
    priority_queue<int>qmax;
    priority_queue<int,vector<int>,greater<int>>qmin;
public:
    MedianFinder() {
        qmax.push(INT_MIN);//1
        qmin.push(INT_MAX);//1
    }    
    void addNum(int num) {
        if(qmax.size()==qmin.size())//2往左边qmax塞
            if(num<=qmin.top())
                qmax.push(num);
            else{
                qmin.push(num);
                qmax.push(qmin.top());
                qmin.pop();
            }
        else//2往右边qmin塞
            if(num>=qmax.top())
                qmin.push(num);
            else{
                qmax.push(num);
                qmin.push(qmax.top());
                qmax.pop();
            }
    }    
    double findMedian() {
        return qmin.size()==qmax.size()?(qmin.top()+qmax.top())/2.0:qmax.top();
    }
};

/**
 * Your MedianFinder object will be instantiated and called as such:
 * MedianFinder* obj = new MedianFinder();
 * obj->addNum(num);
 * double param_2 = obj->findMedian();
 */
class MedianFinder {
    priority_queue<int>qmax;
    priority_queue<int,vector<int>,greater<int>>qmin;
public:
    MedianFinder() {}    
    void addNum(int num) {
        qmax.push(num);
        qmin.push(qmax.top());
        qmax.pop();
        if(qmax.size()<qmin.size()){
            qmax.push(qmin.top());
            qmin.pop();
        }
    }    
    double findMedian() {
        return qmin.size()==qmax.size()?(qmin.top()+qmax.top())/2.0:qmax.top();
    }
};

一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。

 

示例 1:

输入:nums = [4,1,4,6]
输出:[1,6] 或 [6,1]


示例 2:

输入:nums = [1,2,10,4,1,4,3,3]
输出:[2,10] 或 [10,2]

 

限制:


    2 <= nums.length <= 10000

class Solution {
public:
    vector<int> singleNumbers(vector<int>& nums) {
        int ab=0,a=0,b=0;
        for(auto &i:nums)
            ab^=i;
        int tmp=1;
        while(!(ab&tmp))tmp<<=1;//
        for(auto &i:nums)
            if(tmp&i)//&
                a^=i;
            else
                b^=i;
        return {a,b};
    }
};

在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。

 

示例 1:

输入:nums = [3,4,3,3]
输出:4


示例 2:

输入:nums = [9,1,7,9,7,9,7]
输出:1

 

限制:


    1 <= nums.length <= 10000
    1 <= nums[i] < 2^31

方法一:计数
方法二:排序

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值