C练题笔记之:Leetcode-1114. 按序打印

C练题笔记之:Leetcode-1114. 按序打印,第1张

C练题笔记之:Leetcode-1114. 按序打印 题目:

给你一个类:

public class Foo {
  public void first() { print("first"); }
  public void second() { print("second"); }
  public void third() { print("third"); }
}
三个不同的线程 A、B、C 将会共用一个 Foo 实例。

线程 A 将会调用 first() 方法
线程 B 将会调用 second() 方法
线程 C 将会调用 third() 方法
请设计修改程序,以确保 second() 方法在 first() 方法之后被执行,third() 方法在 second() 方法之后被执行。

提示:

尽管输入中的数字似乎暗示了顺序,但是我们并不保证线程在 *** 作系统中的调度顺序。
你看到的输入格式主要是为了确保测试的全面性。
 

示例 1:

输入:nums = [1,2,3]
输出:"firstsecondthird"
解释:
有三个线程会被异步启动。输入 [1,2,3] 表示线程 A 将会调用 first() 方法,线程 B 将会调用 second() 方法,线程 C 将会调用 third() 方法。正确的输出是 "firstsecondthird"。
示例 2:

输入:nums = [1,3,2]
输出:"firstsecondthird"
解释:
输入 [1,3,2] 表示线程 A 将会调用 first() 方法,线程 B 将会调用 third() 方法,线程 C 将会调用 second() 方法。正确的输出是 "firstsecondthird"。
 

提示:
nums 是 [1, 2, 3] 的一组排列

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/print-in-order
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

结果:

方法一:暴力while

 

方法二:信号

解题思路:

方法一:暴力while

这就是暴力的while,给定两个bool型的值在类中。

当第一个打印完将first置为true,当第二个打印完将second置为true。应这个方法达到让函数感知到打印到哪一个了。

1,first函数打印不需要判断,只是打印完置为true即可。

2,second函数需要判断,当first为false且second为true的时候说明不是当前函数改打印的因此一直在循环。

3,third函数中判断first和second都为true的时候循环等待。

这个方法暴力能解决,但是耗时特别长: 

方法二:信号

指定两个信号,信号first和信号second。

和上面的思路一样,只是设置false和true用信号代替,while用sem_wait代替,设置true用sem_pose代替,此方法耗时很短。

代码:

方法一:暴力while

typedef struct {
    // User defined data may be declared here.
    bool first;
    bool second;
} Foo;

Foo* fooCreate() {
    Foo* obj = (Foo*) malloc(sizeof(Foo));
    
    // Initialize user defined data here.
    obj->first = false;
    obj->second = false;
    
    return obj;
}

void first(Foo* obj) {
    
    // printFirst() outputs "first". Do not change or remove this line.
    while(obj->first || obj->second);
    printFirst();
    obj->first = true;
}

void second(Foo* obj) {
    while(obj->first == false || obj->second);
    
    // printSecond() outputs "second". Do not change or remove this line.
    printSecond();
    obj->second = true;
}

void third(Foo* obj) {
    while(obj->first == false || obj->second == false);
    
    // printThird() outputs "third". Do not change or remove this line.
    printThird();
}

void fooFree(Foo* obj) {
    // User defined data may be cleaned up here.
    free(obj);
}

方法二:信号

typedef struct {
    // User defined data may be declared here.
    sem_t first;
    sem_t second;
} Foo;

Foo* fooCreate() {
    Foo* obj = (Foo*) malloc(sizeof(Foo));
    
    // Initialize user defined data here.
    sem_init(&(obj->first), 0, 0);
    sem_init(&(obj->second), 0, 0);
    return obj;
}

void first(Foo* obj) {
    
    // printFirst() outputs "first". Do not change or remove this line.
    printFirst();
    sem_post(&(obj->first));
}

void second(Foo* obj) {
    
    sem_wait(&(obj->first));
    // printSecond() outputs "second". Do not change or remove this line.
    printSecond();
    sem_post(&(obj->second));
}

void third(Foo* obj) {
    sem_wait(&(obj->second));
    // printThird() outputs "third". Do not change or remove this line.
    printThird();
}

void fooFree(Foo* obj) {
    // User defined data may be cleaned up here.
    sem_destroy(&(obj->first));
    sem_destroy(&(obj->second));
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5699255.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存