-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathLC_Easy_Logger_Rate_Limiter.c
113 lines (103 loc) · 3.4 KB
/
LC_Easy_Logger_Rate_Limiter.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
// Design a logger system that receive stream of messages along with its timestamps, each message should be printed if and only if it is not printed in the last 10 seconds.
//
// Given a message and a timestamp (in seconds granularity), return true if the message should be printed in the given timestamp, otherwise returns false.
//
// It is possible that several messages arrive roughly at the same time.
//
// Example:
//
// Logger logger = new Logger();
//
// // logging string "foo" at timestamp 1
// logger.shouldPrintMessage(1, "foo"); returns true;
//
// // logging string "bar" at timestamp 2
// logger.shouldPrintMessage(2,"bar"); returns true;
//
// // logging string "foo" at timestamp 3
// logger.shouldPrintMessage(3,"foo"); returns false;
//
// // logging string "bar" at timestamp 8
// logger.shouldPrintMessage(8,"bar"); returns false;
//
// // logging string "foo" at timestamp 10
// logger.shouldPrintMessage(10,"foo"); returns false;
//
// // logging string "foo" at timestamp 11
// logger.shouldPrintMessage(11,"foo"); returns true;
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
typedef struct
{
int key;
int ts;
struct Node* next;
}Node;
typedef struct {
int log_size;
Node** Log;
}Logger;
Logger* loggerCreate();
int key_calc(char*);
bool loggerShouldPrintMessage(Logger*, int, char*);
void loggerFree(Logger*);
/** Initialize your data structure here. */
Logger* loggerCreate() {
Logger *obj = (Logger*)malloc(sizeof(Logger));
obj -> log_size = 1000;
obj -> Log = (Node**)calloc(obj -> log_size, sizeof(Node*));
return obj;
}
int key_calc(char* m)
{
int ret_key = 0;
while(*m != '\0') ret_key += *m++ - '0';
return ret_key;
}
/** Returns true if the message should be printed in the given timestamp, otherwise returns false.
If this method returns false, the message will not be printed.
The timestamp is in seconds granularity. */
bool loggerShouldPrintMessage(Logger* obj, int timestamp, char* message) {
int temp_key = key_calc(message);
Node* temp_head = obj -> Log[temp_key % obj -> log_size];
while(temp_head != NULL)
{
if(temp_head -> key == temp_key)
{
if(timestamp - temp_head -> ts >= 10)
{
temp_head -> ts = timestamp;
return true;
}
else return false;
}
temp_head = temp_head -> next;
}
temp_head = (Node*)malloc(sizeof(Node));
temp_head -> key = temp_key;
temp_head -> ts = timestamp;
temp_head -> next = obj -> Log[temp_key % obj -> log_size];
obj -> Log[temp_key % obj -> log_size] = temp_head;
return true;
}
void loggerFree(Logger* obj) {
free(obj);
}
/**
* Your Logger struct will be instantiated and called as such:
* struct Logger* obj = loggerCreate();
* bool param_1 = loggerShouldPrintMessage(obj, timestamp, message);
* loggerFree(obj);
*/
void main()
{
struct Logger* obj = loggerCreate();
printf("%s\n", loggerShouldPrintMessage(obj, 1, "foo") ? "true" : "false");
printf("%s\n", loggerShouldPrintMessage(obj, 2, "bar") ? "true" : "false");
printf("%s\n", loggerShouldPrintMessage(obj, 3, "foo") ? "true" : "false");
printf("%s\n", loggerShouldPrintMessage(obj, 8, "bar") ? "true" : "false");
printf("%s\n", loggerShouldPrintMessage(obj, 10, "foo") ? "true" : "false");
printf("%s\n", loggerShouldPrintMessage(obj, 11, "foo") ? "true" : "false");
loggerFree(obj);
}