- 统计位数为偶数的数字
给你一个整数数组 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计算位数进行辨别。
- 按序打印
我们提供了一个类:
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();//线程被唤醒后}
};