我IS ~F 2022-02-25 08:22 采纳率: 50%
浏览 96
已结题

蓝桥杯 字串分值和 如何取优化此代码的内存?


#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100000

typedef struct node{
    char data;
    struct node *next;
}linkList,LNode;

void init(linkList *L) {
    //L = (linkList*)malloc(sizeof(linkList));
    L->next = NULL;
    L->data = '\0';
}

void add(linkList *L,char x) {
    LNode *p=(LNode*)malloc(sizeof(LNode));
    p->data = x;
    p->next = L->next;
    L->next = p;
    L = p;
}


void del(linkList *L, char x) {
    LNode *p = L->next;
    int flag = 0;
    LNode * pre = L;
    while (p != NULL) {
        
        if (p->data == x&&!flag) {
            flag = 1;
            pre = p;
            p = p->next;
        }
        else if (p->data == x && flag) {
            LNode *temp = p->next;
            if (temp != NULL) {
                pre->next = temp;
                //free(temp);
            }
            else
            {
                pre->next = p->next;
            }
            p = p->next;
        }
        else {
            pre = p;
            p = p->next;
        }
    }
}

main() {
    char *S = (char*)malloc(sizeof(char)*MAXSIZE);
    scanf_s("%s", S, MAXSIZE);
    int n = 1;
    for (n = 1; S[n - 1] != '\0'; n++);
    int sum = 0;
    linkList * L=(linkList*)malloc(sizeof(linkList));
    
    
    for (int i = 0; i < n-1; i++) {
        for (int j = i; j < n-1; j++) {
            init(L);
            int count = 0;
            for (int k = i; k <= j; k++) {
                add(L, S[k]);
            }
            LNode *head = L;
            LNode *p = head->next;
            while (p!= NULL) {
                char c = p->data;
                LNode *t = p->next;
                while (t!=NULL) {
                    if (c == t->data)
                        del(L, c);
                    t = t->next;
                }
                free(t);
                p = p->next;
            }
            free(p);
            LNode *p3 = L;
            while (p3->next != NULL) {
                count++;
                p3 = p3->next;
            }
            sum += count;
        }

    }
    printf("%d", sum);
}

展开全部

  • 写回答

3条回答 默认 最新

  • orange4reg 2022-02-25 15:59
    关注
    
    
    ```c
    int F(char *str)
    {
        int check;
        int sumall;
        int sumsub;
    
        sumall = 0;
    
        for( ; *str != 0; str++)
        {
            check = 0x03FFFFFF;
            sumsub = 0;
    
            for(char *c = str; *c != 0; c++)
            {
                if(/*check > 0 && //为什么又封起来了,因为有26个字母的字符串不大可能*/ (((int)1 << (*c - 'a')) & check) != 0)
                {
                    sumsub++;
                    check = check - ((int)1 << (*c - 'a')); //修改了,再减少一次运算,不过我以前有测试过位运算比加减法要快一些的,快多少就忘记了,不知道两个位运算和一个减法到底谁快
                }
    
                sumall = sumall + sumsub;
            }
        }
    
        return sumall;
    }
    
    

    ```

    展开全部

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
    orange4reg 2022-02-25 16:02

    你应该是时间效率上不行。内存应该不是最主要。

    回复
    orange4reg 回复 orange4reg 2022-02-25 16:30

    
    
    ```c
    int F(char *str)
    {
        int sum;
        int check;
    
        sum = 0;
    
        for( ; *str != 0; str++)
        {
            check = 0x03FFFFFF;
    
            for(char *c = str; *c != 0; c++)
            {
                if((((int)1 << (*c - 'a')) & check) != 0)
                {
                    sum++;
                    check = check & ~((int)1 << (*c - 'a'));
                }
    
                if(check == 0)
                {
                    break:
                }
            }
        }
    
        return sum;
    }
    
    

    ```

    1
    回复
    orange4reg 回复 orange4reg 2022-02-25 16:32

    你试试这个行不行,我自认为最优化了,思路是没有问题的,但因为老婆不让开电脑所以无法验证,有问题可以交流。

    回复
    展开全部22条评论
查看更多回答(2条)
编辑
预览

报告相同问题?

问题事件

  • 系统已结题 3月7日
  • 已采纳回答 2月28日
  • 创建了问题 2月25日

悬赏问题

  • ¥15 传人记程序做的plc 485从机程序该如何写
  • ¥15 已知手指抓握过程中掌指关节、手指各关节和指尖每一帧的坐标,用贝塞尔曲线可以拟合手指抓握的运动轨迹吗?
  • ¥50 libwebsockets 如何添加其他socket事件回调
  • ¥50 实现画布拖拽算子排布,通过flink实现算子编排计算,请提供思路
  • ¥15 esium自定义材质拉伸问题
  • ¥15 cmake+mingw使用<mysqlx/xdevapi.h>报错
  • ¥15 eNSP中防火墙的使用
  • ¥15 关于#mlnet#的问题:mlnet相关请求(语言-c#)
  • ¥15 lvgl7.11怎么做出文字被选中的效果
  • ¥50 如何快速查看手机目标app的主要服务器ip
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部