icoding复习3

icoding复习3

1. 不调用库函数,自己实现字符串的比较操作:该操作当比较的两个字符是都是字母,且两个字符互为大小写
(如a和A、e和E)时认为两个字符相同,否则不同,其比较结果按这两个字符的原值确定。函数的返回值规定如下:
返回值 < 0:第一个不匹配的字符在 ptr1 中的值低于 ptr2 中的值
返回值 == 0:两个字符串的内容相等
返回值 > 0:第一个不匹配的字符在 ptr1 中的值大于在 ptr2 中的值

int str_compare(const char* ptr1, const char* ptr2);
#include
#include
#include "dsstring.h" //请不要删除,否则检查不通过
//又是字符串操作!!!! 
int str_compare(const char* ptr1, const char* ptr2){
    int i;
    // a == 97 A == 65 
    for(i = 0; ptr1[i] && ptr2[i]; i++){
        if(ptr1[i] != ptr2[i]){//字符相等就继续,不等判断大小写关系 
            if(ptr1[i] + 'a' - 'A' == ptr2[i] || ptr2[i]+'a'-'A' == ptr1[i])
                continue;//这一步可以分开写,没有判断是否ptr1[i]和ptr2[i]为字母,但是icoding监测可以通过
                //其实当两个字符恰好相差32就不行了 
            else
                return ptr1[i]-ptr2[i];
        }
    }
    //后面的代码可以略掉 
    if(ptr1[i])
        return (int)ptr1[i];
    else
        return (int)ptr2[i];
     
}
//解法2 icoding检测数据不全 ! 100
int str_compare(const char* ptr1, const char* ptr2)
{
    // a == 97 A == 65 
    int i;
    for (i = 0; ptr1[i] != '\0' || ptr2[i] != '\0';) {
        if (ptr1[i] == ptr2[i] )  //判断字符是否相等 
            i++;
        else if(ptr1[i] <= 'z' && ptr1[i] >= 'a'&& ptr1[i] - 32 == ptr2[i])
        //判断是否为大小写不同的相同字母, (如果同为相同的大写或者相同的小写之前检测了), 
            i++;
        else if(ptr2[i] <= 'z' && ptr2[i] >= 'a'&& ptr2[i] - 32 == ptr1[i])
            i++;
        else
            return ptr1[i] - ptr2[i];//可以自动转换为int
        //注意点第二三个if是必要的, 不能直接判断ptr1[1] -ptr2[i] == +-32 , 也有可能有ASC码正好相差32的非字母字符 
    }
    return 0;
}

//90+问题代码
int str_compare(const char* ptr1, const char* ptr2)
{
    char a, b;
    int i;
    for (i = 0; ptr1[i] != '\0' && ptr2[i] != '\0'; i++) {
        a = ptr1[i];
        b = ptr2[i];
        if (a <= 'Z' && a >= 'A' && b <= 'z' && b >= 'a')
            a = a - 'A' + 'a';//有问题, 这部分的意思是a为大写, b同时也为字母并且为小写 , 那么
            //a转化为小写并且与b比较, 但是如果值不等的话会改变返回值大小 
        if (b <= 'Z' && b >= 'A' && a <= 'z' && a >= 'a')
            b = b - 'A' + 'a';
        if (a == b)
            continue;
        else
            return a - b;
    }
    return ptr1[i] - ptr2[i];

2.串替换

in,原始字符串,保持不变; out, 存放替换结果的字符串; outlen,out空间的大小
oldstr,要替换的旧字符串; newstr,替换成的新字符串
函数返回成功替换的次数,即有多少个子串被成功替换
在替换过程中,任何情况下所得字符串(及结束符)不应该超过 outlen,
如果某次替换所得字符串的长度超过 outlen,则不进行这次替换操作,整个替换操作结束。如:
原始串为 "aaabbbccc",outlen 为14, oldstr 为 "c",newstr 为 "333" 时,
两次替换后得 "aaabbb333333c",此时字符串占用空间为14字节。
如果再进行替换,则会超出 out 所占用的空间,所以停止替换操作。
此时函数应该返回 2, out指向的串为 "aaabbb333333c"
再如:原始串为 "aaabbbccc",outlen 为10, oldstr 为 "bb",
newstr 为 "123456",进行替换后所得的串应该为 "aaa123456" 
(长度为9)与结束符一共占 10 个字节,此时函数应该返回 1

#include "dsstring.h"
#include
#include

int get_len(const char *str){
    int i;
    for(i = 0; str[i]; i++)
        ;
    return i;
}
//另一种写法
int get_len(const char* s)
{
    int i = 0;
    while (*(s + i)) {
        i++;
    }
    return i;
    //返回值是实际长度, 不包括空字符

//理解:旧串换新串,每一个新串要求能够全部放下并且不忽略尾部空字符, 操作的是字符指针...! 
int str_replace(const char* in, char* out, int outlen, const char* oldstr, const char* newstr)
{
    int i, j = 0, ostr, nstr = 0;//i 指示in, j指示out. 
    int n = 0;
    
    if(outlen <= 0) return false; 
    
    //out需要分配空间??? 不需要..... 
    //下面思路整理:
    //in的字符不与oldstr第一个字符匹配,直接复制, 进入下一轮循环 
    //判断剩余空间是否足够, 一种溢出是新串字符加out内已有字符长度溢出,一种是in剩余字符加out已有字符溢出,直接剩余全部复制
    //空间足够,判断字符是否匹配,判断匹配成功,那么ostr指向oldstr最后一个'\0' 
    //执行换串操作 ,n++ 
    //最后如果串换完并且in中字符全部复制完但是j没有达到outlen-2,放空字符 
    for(i = 0; i < get_len(in) && j < outlen - 1;){
    //对于j,总长度为outlen, 最后一个下标为outlen-1,最后一个位置放'\0' ,所以j最大取outlen-2 
    
        if(in[i] != oldstr[0]){
            out[j++] = in[i++];
            continue; 
        }
            
        if(j + get_len(newstr) >= outlen - 1 || get_len(in) - i + j >= outlen - 1)
        {//先看剩余空间可以换串吗 ,如果不能就剩余全部复制 
            for(; j < outlen;)
                out[j++] = in[i++];l
            return n;
        }
        
        for(ostr = 0; otsr < get_len(oldstr); ostr++)
            if(oldstr[ostr] != in[i+ostr])
                break;
                
        if(ostr == get_len(oldstr) - 1){//if(!(oldstr[ostr]))等价 
            for(nstr = 0; j < get_len(newstr); j++)
                out[j] = newstr[nstr++];
            n++;
            i += get_len(oldstr);
        }
        else
            out[j++] = in[i++]; 
    }
    
    for(; j < outlen - 1; j++)
        out[j] = '\0';
    out[j] = '\0';

    return n;
}


3. 块链串 
#include
#include
#define BLOCK_SIZE 4    // 可由用户定义的块大小
#define BLS_BLANK '#'   // 用于空白处的补齐字符

typedef struct _block {
    char ch[BLOCK_SIZE];    //块的数据域
    struct _block *next;    //块的指针域
} Block;

typedef struct {
    Block *head;        // 串的头指针
    Block *tail;        // 串的尾指针
    int len;            // 串的当前长度
} BLString;

//字符串初始化函数:
void blstr_init(BLString *T) {
    T->len = 0;
    T->head = NULL;
    T->tail = NULL;
}
这些定义已包含在头文件 dsstring.h 中,请实现块链串的子串查找操作:

bool blstr_substr(BLString src, int pos, int len, BLString *sub);
src为要查找的字符串
pos为子串开始的下标
len为子串的长度
sub在函数调用运行前指向一个已经初始化好的空串,在函数返回时,sub指向串src从第pos个字符起长度为len的子串
函数查找成功返回true,参数不正确返回 false
#include
#include
#include "dsstring.h" // 请不要删除,否则检查不通过


//满分代码

!!!!操作字符串长度 
int len(const char* s)
{
    int q = 0;
    while (*s != '\0') {//可以简化while(*s++) q++;
        q++;
        s++;//!!!
    }
    return q;
}
//易错点分析:
//1. 对于字符指针的操作, len函数书写
//2. 对于块的个数边界条件判定
//3. 对于块指针操作,分类讨论
//4. 尾指针置空,空白地方用'#'填充 

int StrAssign(BLString* S, const char* cstr)
{//将cstr复制到块链串S中
 
    int i, j, k, len;
    Block *p, *q;
    len = strlen(cstr); //len为链串的长度
    if (len == 0)
        return 0;
    S->len = len;
    
    j = len / BLOCK_SIZE; //j为链串的结点数 ,也就是块个数` 
    if (len % BLOCK_SIZE)
        j++;
        
    for (i = 0; i < j; i++) {
        p = (Block*)malloc(sizeof(Block));
        if (!p)
            return 0;//可以简化
            
        //k指示每一个块内部字符ch[]下标
        for (k = 0; k < BLOCK_SIZE && *cstr; k++) //将字符串ctrs中的字符赋值给链串的数据域
            *(p->ch + k) = *cstr++;//!!!!!!
            
        if (i == 0) //如果是第一个结点
            S->head = q = p; //头指针指向第一个结点
        else {//q为跟踪指针 
            q->next = p;
            q = p;
        }
        if (!*cstr) //如果是最后一个链结点
        {
            S->tail = q; //将尾指针指向最后一个结点
            q->next = NULL; //将尾指针的指针域置为空
            for (; k < BLOCK_SIZE; k++) //最后一个结点用'#'填充
                *(q->ch + k) = BLS_BLANK;
        }
    }
    return 1;
}
bool blstr_substr(BLString src, int pos, int len, BLString* sub)
{
    char* t;
    if (pos < 0 || pos >= src.len || len < 1)
        return false;
    int n = pos / BLOCK_SIZE, h = pos % BLOCK_SIZE;
    Block* temp = src.head;
    
    for (int i = 0; i < n; i++)
        temp = temp->next;//temp直接指向pos位置那个块 
    
    char str[100];
    int i = 0;
    while (i < len) {
        if (h >= BLOCK_SIZE) {
            temp = temp->next;
            h = 0;
        } 
        else {
            if (!temp || temp->ch[h] == BLS_BLANK)
                break;
            str[i++] = temp->ch[h++];
        }
    }
    str[i] = '\0';
    StrAssign(sub, str);
    return true;
}
 
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/311461.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

redis过期监听性能_基于Redis的延迟处理

延迟处理是一个非常常用的一个功能;例如, 下单成功后,在30分钟内没有支付,自动取消订单;延迟队列便是延迟处理中最常见的实现方式;先一起看下JDK中延迟队列是如何实现的.JUC的DelayQueue在JDK中, 提供了一套延迟队列的实现, 是JUC包中DelayQueue类.在使用时只需要让处理的元素对…

洛谷 P2040 打开所有的灯-dfs

题目背景 pmshz在玩一个益(ruo)智(zhi)的小游戏&#xff0c;目的是打开九盏灯所有的灯&#xff0c;这样的游戏难倒了pmshz。。。 题目描述 这个灯很奇(fan)怪(ren)&#xff0c;点一下就会将这个灯和其周围四盏灯的开关状态全部改变。现在你的任务就是就是告诉pmshz要全部打开这…

icoding复习4 数组 十字链表

icoding 复习4 1. 矩阵加法 实现三元组表示的两个稀疏矩阵的加法。 #define MAXSIZE 100 //假设非零元个数的最大值为100 typedef struct { int i,j; //非零元的行下标和列下标&#xff0c;i 和 j 从 1 开始计数&#xff0c;与数学中矩阵元素的…

【译】来看看WebWindow,一个跨平台的.NET Core webview 库

本文翻译自 ASP.NET 项目组的 Steve Sanderson 的博客&#xff0c;发表于 2019 年 11 月 18 日。Steve Sanderson 是 Blazor 最早的创造者。它类似于 Electron&#xff0c;但没有捆绑 Node.js 和 Chromium&#xff0c;也没有大部分 API。我的上一篇文章研究了如何用 web 渲染的…

sql if 和insert_拼多多面试:Mybatis是如何实现SQL语句复用功能的?

在工作中&#xff0c;往往有这样的需求&#xff0c;对于同一个sql条件查询&#xff0c;首先需要统计记录条数&#xff0c;用以计算pageCount&#xff0c;然后再对结果进行分页查询显示&#xff0c;看下面一个例子。<sql id"studentProperties"><!--sql片段-…

上元节的灯会(亮)-dfs

题目背景 上元佳节&#xff0c;庙会里举办着各式各样的庆典活动&#xff0c;牛宝也兴奋地参与其中。突然&#xff0c;他被一个新颖的点灯游戏所吸引&#xff0c;游戏要求最终点亮所有在场的花灯&#xff0c;每盏灯都有开关两种状态&#xff0c;每一次点击在场的一盏任意状态的花…

代码演示C#各版本新功能

代码演示C#各版本新功能C#各版本新功能其实都能在官网搜到&#xff0c;但很少有人整理在一起&#xff0c;并通过非常简短的代码将每个新特性演示出来。代码演示C#各版本新功能C# 2.0版 - 2005泛型分部类型匿名方法可以为null的值类型迭代器协变和逆变C# 3.0版 - 2007自动实现的…

icoding复习5 树 感觉难度巨大....

icoding 复习5 1. 先序遍历 已知二叉树按照二叉链表方式存储&#xff0c;利用栈的基本操作写出先序遍历非递归形式的算法&#xff1a; void pre_order(BiTree root); 二叉树的相关定义如下&#xff1a; typedef int DataType; typedef struct Node{ DataType data; …

python 进行一元线性回归并输出相关结果_Python实现一元线性回归实战

回归是一种有监督的学习方式&#xff0c;需要根据历史数据对未知数据做出预测。在此&#xff0c;以房屋面积预测房屋价格为例&#xff1a;首先&#xff0c;读入数据&#xff1a;代码如下&#xff1a;import pandas as pdimport numpy as npfrom io import StringIOfrom sklearn…

《C++ Primer》第一章的 Sales_item.h头文件源码

Sales_item.h不是C自带的&#xff0c;需要自己安装&#xff0c;这个库作者已经写好了, Sales_item.h 头文件代码如下&#xff1a; #ifndef SALESITEM_H #define SALESITEM_H #include <iostream> #include <string>class Sales_item{ public:Sales_item(const std…

icoding复习7, 8

icoding复习7 哈希,AVL 查找 必考点!!! 1. 哈希表创建 typedef enum{ HASH_OK, HASH_ERROR, HASH_ADDED, HASH_REPLACED_VALUE, HASH_ALREADY_ADDED, HASH_DELETED, HASH_NOT_FOUND, } HASH_RESULT; typedef struct __HashEntry HashEntry; struc…

python加载模型包占用内存多大_加载pickle python对象会占用大量内存

我有一个python的pickle对象,它生成一个180 Mb的文件.当我取消它时,内存使用量会爆炸到2或3Gb.你有类似的经历吗&#xff1f;这是正常的吗&#xff1f;对象是包含字典的树&#xff1a;每个边是一个字母,每个节点都是一个潜在的单词.因此,要存储一个单词,您需要的边数与该单词的…

《C++ Primer》1.52节练习

练习1.23 #include <iostream> #include "Sales_item.h"using namespace std;int main() {Sales_item trans1, trans2;cout << "请输入若干销售记录:" << endl;if (cin >> trans1) {int num 1;while (cin >> trans2)if (t…

ASP.NET Core 反向代理部署知多少

引言最近在折腾统一认证中心&#xff0c;看到开源项目[IdentityServer4.Admin&#xff1a;https://github.com/skoruba/IdentityServer4.Admin]集成了IdentityServer4和管理面板&#xff0c;就直接拿过来用了。在尝试Nginx部署时遇到了诸如虚拟目录映射&#xff0c;请求头超长、…

函数传参string_JavaScript 高阶函数入门浅析

原文&#xff1a;https://www.freecodecamp.org/news/a-quick-intro-to-higher-order-functions-in-javascript-1a014f89c6b/译者&#xff1a;jingruzhang校对者&#xff1a;acusp高阶函数高阶函数可以接收函数作为参数&#xff0c;同时也可以返回一个新的函数。高阶函数之所以…

all()与any()

all():当可迭代对象为空时返回True。或者当可迭代对象中是否所有值都为True&#xff0c;所有值都为True,则返回True。否则返回False。any():当可迭代对象为空时返回False。或者当可迭代对象中是否存在一个为True的值&#xff0c;若存在&#xff0c;返回True,否则返回False 示例…

.NET Core开发实战(第13课:配置绑定:使用强类型对象承载配置数据)--学习笔记...

13 | 配置绑定&#xff1a;使用强类型对象承载配置数据要点&#xff1a;1、支持将配置值绑定到已有对象2、支持将配置值绑定到私有属性上继续使用上一节代码首先定义一个类作为接收配置的实例class Config {public string Key1 { get; set; }public bool Key5 { get; set; }pub…

Python--第3次平时作业

目录 一、单项选择题 二、程序填空题 三、所有测试代码如下: 一、单项选择题 题号 1 2 3 4 5 6 7 8 9 10 答案 C A A C C D D D D C 题号 11 12 13 14 15 16 17 18 19 20 答案 A A C C B C A C B A 题号 21 22 23 24 25 …

工业互联网白皮书_发布|《工业互联网平台安全白皮书(2020)》发布

12月4日&#xff0c;2020年中国工业信息安全大会暨全国工控安全深度行(京津冀站)在北京国际会议中心举行。大会由国家工业信息安全发展研究中心、工业信息安全产业发展联盟主办&#xff0c;以“贯彻总体国家安全观&#xff0c;把牢工控安全基准线”为主题。会上&#xff0c;国家…