当前位置: 代码迷 >> 综合 >> leetcode简单1295/1114
  详细解决方案

leetcode简单1295/1114

热度:6   发布时间:2024-01-18 04:47:24.0
  1. 统计位数为偶数的数字
    给你一个整数数组 nums,请你返回其中位数为 偶数 的数字的个数。
    1 <= nums.length <= 500
    1 <= nums[i] <= 10^5
//本解
class Solution {
    
public:int findNumbers(vector<int>& nums) {
    int ans=0;for(int num:nums){
    if((int)(log10(num)+1) % 2 == 0){
    //log(x)以e为底,log10(x)以10为底,注意取指不一定为整数,需要向下取整ans++;}}return ans;}
};

另解
考虑到题目所给数字范围在1-100000之间,符合条件的只有两位数和四位数以及100000,即为

if((num>=10&&num<100)||(num>=1000&&num<10000)||num==100000){
    //注意十万不能漏
ans++;
}

同理也可以另写函数用n/=10计算位数进行辨别。

  1. 按序打印
    我们提供了一个类:
    public class Foo {
    public void first() { print(“first”); }
    public void second() { print(“second”); }
    public void third() { print(“third”); }
    }
    三个不同的线程将会共用一个 Foo 实例。
    线程 A 将会调用 first() 方法
    线程 B 将会调用 second() 方法
    线程 C 将会调用 third() 方法
    请设计修改程序,以确保 second() 方法在 first() 方法之后被执行,third() 方法在 second() 方法之后被执行。

(想到了互斥锁但没想出来怎么做)
热门求解中,通过互斥锁结合条件变量的方式进行:
互斥锁防止多个线程同时访问共享资源对象,在同一时间只有一个线程可拥有一特定锁对象,其他线程获取锁会阻塞直到锁资源被释放或直接返回失败。

condition_variable 参考地址https://www.2cto.com/kf/201506/411327.html
std::condition_variable
是条件变量, 当 std::condition_variable对象的某个wait 函数被调用的时候,它使用 std::unique_lock(通过 std::mutex) 来锁住当前线程。当前线程会一直被阻塞,直到另外一个线程在相同的 std::condition_variable 对象上调用了 notification 函数来唤醒当前线程。
std::condition_variable::notify_all()
唤醒所有的等待(wait)线程。如果当前没有等待线程,则该函数什么也不做。
std::condition_variable::notify_one()
唤醒某个等待(wait)线程。如果当前没有等待线程,则该函数什么也不做,如果同时存在多个等待线程,则唤醒某个线程是不确定的(unspecified)。

class Foo {
    condition_variable cv;//全局条件变量mutex mtx;//全局互斥锁int k = 0;
public:void first(function<void()> printFirst) {
    printFirst();k = 1;cv.notify_all();    // 通知其他所有在等待唤醒队列中的线程}void second(function<void()> printSecond) {
    unique_lock<mutex> lck(mtx);   // lock mtxcv.wait(lck, [this](){
     return k == 1; });  //当前线程阻塞直到k等1才能继续运行//[this](){ return k == 1; }——lambda表达式并且捕获this指针//相当于函数返回k等1printSecond();k = 2;cv.notify_one();    // 随机通知一个在等待唤醒队列中的线程}void third(function<void()> printThird) {
    unique_lock<mutex> lck(mtx);   // lock mtxcv.wait(lck, [this](){
     return k == 2; });  //当前线程阻塞阻塞直到k等2 才能继续运行printThird();//线程被唤醒后}
};