赛码网-询问字典序-超时代码求改进

时间限制:1S 内存限制:64MB

原题链接

描述

输入n个字符串S1,S2,...,Sn,对于第i个字符串,你需要回答在前i-1个字符串中,有多少个字符串的字典序严格比Si小。

输入描述

第一行输入一个数n(1≤n≤100000),接下来输入n行,每行一个字符串。所有单个字符串的长度不超过100000,所有字符串的长度之和不超过200000,所有字符串的字符由26个小写字母构成。

输出描述

输出n行n个数,第i个数表示前i-1个串中,有多少个字符串的字典序严格比Si小。

示例

输 入:

5
one
one
two
three
four

返回值:

0
0
2
2
0

我的问题代码:时间超了,按照网上那个思路改成C++版本依旧超时,赛码网这个太叛逆了!!!

8/11组用例通过

运行时间:1052 ms

占用内存:5640 kb

用例输入:

50000
……
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>


static int insertSortedList(std::vector<std::string>& List, int size, const std::string& key)
{
    int left = 0, right = size - 1;
    while (left <= right) {
        int mid = (left + right) / 2;
        int ret = List[mid].compare(key);
        if (ret < 0) // List[mid] < new_word
            left = mid + 1;
        else // List[mid] >= new_word
            right = mid - 1;
    }
    List.insert(List.begin()+left, key);

    return left;
}

int main()
{
    int N;
    std::vector<std::string> List;
    std::cin >> N;
    List.reserve(N);
    for (int i = 0; i < N; i++) {
        std::string key;
        std::cin >> key;
        std::cout << insertSortedList(List, i, key) << std::endl;
    }

    return 0;
}

网上执行通过的代码链接

思路

1、 从小到大排序;

2、二分法查找插入;

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
const int max_len = 100;
static int insertSortedList(char **List, int size, char *key)
{
    int left = 0, right = size - 1;
    while (left <= right) {
        int mid = (left + right) / 2;
        int ret = strcmp(List[mid], key);
        if (ret < 0) // List[mid] < new_word
            left = mid + 1;
        else // List[mid] >= new_word
            right = mid - 1;
    }
 
    for(int i = size; i > left; i--)
        List[i] = List[i - 1];
 
    List[left] = key;
    return left;
}
 
int main()
{
    int N;
    char **List;
    scanf("%d", &N);
    List = (char **)malloc(N * sizeof(char *));
    for(int i = 0; i < N; i++){
        char *key = (char *)malloc(max_len * sizeof(char));
        scanf("%s", key);
        printf("%d\n", insertSortedList(List, i, key));
        key = NULL;
    }
 
    //for(int i = 0; i < N; i++)
    //    free(List[i]);
    free(List);
    return 0;
}

#在线编程##编程##算法笔记##牛客刷题##牛客在线求职答疑中心#
全部评论
超时是必定的,你可以算一下时间复杂度,然后改进一下自己的算法,比如写一个排序➕二分查找,跟网上一样,最后建议把cin改成scanf输入更快
点赞 回复 分享
发布于 2023-06-05 11:18 湖南

相关推荐

今天 16:15
门头沟学院 Java
点赞 评论 收藏
分享
DKS233:(1)专业技能:Java8也太旧了,最少也要了解到JDK17吧,可以参考现在SpringBoot支持的Java最低版本,熟悉mysql基本理论具体指啥,是锁这种具体原理还是分库分表这些业务场景,spring这些专业词汇,大小写要写对(全篇简历都有这个问题,显得不严谨),熟悉使用框架进行业务开发就别写了,如果要写,起码要写到框架原理部分吧,比如aop,启动原理什么的,springcloud具体指哪些模块呢,写清楚,网关还是鉴权还是什么,“改造”没必要写吧,你直接说用springcloud开发的不就行了(2)项目经历:首先格式就有大问题,时间怎么能换行呢,调整一下,响应速度那个,如果指的是将部分数据从其他数据库转到redis的提升就别写了,因为这个不算难点,redis可以写写分布式这些,比如容灾怎么实现的,数据库同步怎么做的
点赞 评论 收藏
分享
评论
3
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务