【算法描述】

  1. 将输入的来电记录按照时间戳从早到晚排序。
  2. 统计所有需要保留的来电记录数量,初始值为0。
  3. 遍历排序后的来电记录列表:
    • 如果当前记录是需要保留的记录,则将保留记录数量加1。
    • 如果当前记录是不需要保留的记录,则判断是否与前一条记录是同一年的,如果是则将保留记录数量加1。
  4. 输出保留记录数量。

【伪代码】 minSavedRecords(records): sort(records) # 将记录按照时间戳排序 savedRecords = 0 # 保留记录数量 for i = 0 to length(records) - 1: if records[i].type == '+': savedRecords += 1 else if records[i].type == '-': if i > 0 and isSameYear(records[i], records[i-1]): savedRecords += 1 return savedRecords

isSameYear(record1, record2): if record1.month > record2.month: return True else if record1.month < record2.month: return False else: if record1.day > record2.day: return True else if record1.day < record2.day: return False else: if record1.hour > record2.hour: return True else if record1.hour < record2.hour: return False else: if record1.minute >= record2.minute: return True else: return False

【复杂性分析】 时间复杂性:排序的时间复杂性为O(nlogn),遍历记录的时间复杂性为O(n),所以总的时间复杂性为O(nlogn)。 空间复杂性:只需要常量级的额外空间,所以空间复杂性为O(1)。

【C语言代码】 #include <stdio.h>

typedef struct { int month; int day; int hour; int minute; char type; } Record;

int isSameYear(Record record1, Record record2) { if (record1.month > record2.month) { return 1; } else if (record1.month < record2.month) { return 0; } else { if (record1.day > record2.day) { return 1; } else if (record1.day < record2.day) { return 0; } else { if (record1.hour > record2.hour) { return 1; } else if (record1.hour < record2.hour) { return 0; } else { if (record1.minute >= record2.minute) { return 1; } else { return 0; } } } } }

int minSavedRecords(Record records[], int n) { // 排序 for (int i = 0; i < n-1; i++) { for (int j = 0; j < n-i-1; j++) { if (isSameYear(records[j], records[j+1])) { // 交换位置 Record temp = records[j]; records[j] = records[j+1]; records[j+1] = temp; } } }

int savedRecords = 0;
for (int i = 0; i < n; i++) {
    if (records[i].type == '+') {
        savedRecords++;
    } else if (records[i].type == '-') {
        if (i > 0 && isSameYear(records[i], records[i-1])) {
            savedRecords++;
        }
    }
}

return savedRecords;

}

int main() { int n; scanf("%d", &n); Record records[n]; for (int i = 0; i < n; i++) { scanf("%d:%d:%d:%d %*s %c", &records[i].month, &records[i].day, &records[i].hour, &records[i].minute, &records[i].type); } int minSaved = minSavedRecords(records, n); printf("%d\n", minSaved); return 0;


原文地址: http://www.cveoy.top/t/topic/hYvK 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录