精华内容
下载资源
问答
  • 面试中经常会考到算法,下面分别讲如何删除一个字符串里的特定字符或特定字符串 一、 题目:输入两个字符串,第一字符串中删除第二个字符串中所有的字符。 例如, 输入”i want to be a excellent programmers...

    面试中经常会考到算法,下面分别讲如何删除一个字符串里的特定字符或特定字符串

    一、

    题目:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。

    例如, 输入”i want to be a excellent programmers”和”aem”,则删除之后的第一个字符串变成”i wnt to b  xcllnt progrrs"

    分析:要编程完成这道题要求的功能可能并不难。毕竟,这道题的基本思路就是在第一 个字符串中拿到一个字符,在第二个字符串中查找一下,看它是不是在第二个字符串中。如果在的话,就从第一个字符串中删除。但如何能够把效率优化到让人 满意的程度,却也不是一件容易的事情。也就是说,如何在第一个字符串中删除 一个字符,以及如何在第二字符串中查找一个字符,都是需要一些小技巧的。

    首先我们考虑如何在字符串中删除一个字符。由于字符串的内存分配方式是连续 分配的。我们从字符串当中删除一个字符,需要把后面所有的字符往前移动一个 字节的位置。但如果每次删除都需要移动字符串后面的字符的话,对于一个长度 为 n 的字符串而言,删除一个字符的时间复杂度为 O(n)。而对于本题而言,有可 能要删除的字符的个数是 n,因此该方法就删除而言的时间复杂度为 O(n2)。

    事实上,我们并不需要在每次删除一个字符的时候都去移动后面所有的字符。我 们可以设想,当一个字符需要被删除的时候,我们把它所占的位置让它后面的字 符来填补,也就相当于这个字符被删除了。在具体实现中,我们可以定义两个指 针(psou和 pkey),初始的时候都指向第一字符的起始位置。当 psou 指向的字符是需要删除的字符,则 psou 直接跳过,指向下一个字符。如果 psou 指向的字符是不需要删除的字符,那么把 psou 指向的字符赋值给 pkey 指向的字符, 并且 psou 和 pkey同时向后移动指向下一个字符。这样,前面被psou 跳过的字符相当于被删除了。用这种方法,整个删除在 O(n)时间内就可以完成。

    接下来我们考虑如何在一个字符串中查找一个字符。当然,最简单的办法就是从 头到尾扫描整个字符串。显然,这种方法需要一个循环,对于一个长度为 n 的字 符串,时间复杂度是 O(n)。 由于字符的总数是有限的。对于八位的 char 型字符而言,总共只有 28=256 个字 符。我们可以新建一个大小为 256 的数组,把所有元素都初始化为 0。然后对于 字符串中每一个字符,把它的 ASCII 码映射成索引,把数组中该索引对应的元素 设为1。这个时候,要查找一个字符就变得很快了:根据这个字符的 ASCII 码, 在数组中对应的下标找到该元素,如果为 0,表示字符串中没有该字符,否则字符串中包含该字符。此时,查找一个字符的时间复杂度是 O(1)。其实,这个数组 就是一个 hash 表。

    基于上述分析,我们可以写出如下代码:

     1 #define _CRT_SECURE_NO_WARNINGS
     2 #include <stdio.h>
     3 #include <stdlib.h>
     4 
     5 char *  deleteStr(char *source, char *key)
     6 {
     7 
     8     int hashTable[256];
     9     memset(hashTable, 0, sizeof(hashTable));
    10     char *point_sou, *point_key;
    11     point_sou = key;
    12     while (*point_sou != '\0')//待删除字符在哈希表里赋值为1
    13     {
    14         hashTable[*point_sou] = 1;
    15         point_sou++;
    16     }
    17     point_sou = source;
    18     point_key = source;
    19     while (*point_sou != '\0')
    20     {
    21         if (!hashTable[*point_sou])//哈希表不为1时不是待删除字符,将sou指针指向的字符赋给key指针指向的字符,将两指针同时向后移
    22         {
    23             *point_key = *point_sou;
    24             point_key++;
    25         }
    26         point_sou++;  //是待删除字符,sou指针继续向前移,key指针停留在待删除字符前
    27     //下一次循环判断是不是待删除字符,不是,将sou指针指向的字符赋给key指针指向的字符,souce也就相当于删除了前面的字符
    28 
    29     }
    30     *point_key = '\0';
    31     return source;
    32 
    33 }
    34 
    35 int main()
    36 {
    37     char p[] = "i want to be a excellent programmers";
    38     char key[] = "aem";
    39     printf("%s\n", deleteStr(p, key));
    40 }

     

    二、

    问题描述: 在给定字符串中查找所有特定子串并删除,如果没有找到相应子串,则不作任何操作。

    要求实现函数:int delete_sub_str(const char *str, const char *sub_str, char *result_str)

    【输入】str:输入的被操作字符串  sub_str:需要查找并删除的特定子字符串

    【输出】result_str:在str字符串中删除所有sub_str子字符串后的结果

    【返回】删除的子字符串的个数

     1 #define _CRT_SECURE_NO_WARNINGS
     2 #include <stdio.h>
     3 #include <stdlib.h>
     4 
     5 
     6 int Mysubstring(char* str_in, char* str_sub, char* str_out)
     7 {
     8     int start = 0;    /* 记录开始比较下标 */
     9     int count = 0;    /* 记录子串个数 */
    10     int j = 0;        /* 记录子串的下标 */
    11     int k = 0;        /* 记录结果字符串的下标 */
    12 
    13     for (int i = 0; str_in[i] != '\0'; i++)
    14     {
    15         start = i;      /* 临时保存比较下标 */
    16         j = 0;          /* 每次开始比较的时候,子串都从0开始,如果第一个字符相等,
    17                            那么就接着比较下一个字符,否则进入下一轮循环 */
    18 
    19         while ((str_in[i] != '\0') && (str_sub[j] != '\0') && (str_in[i] == str_sub[j]))
    20         {
    21             i++;
    22             j++;
    23         }
    24 
    25         if (str_sub[j] != '\0')                /* 如果不是子串 */
    26         {
    27             str_out[k++] = str_in[start];   i = start;   /* 将当前比较的这个字符存入结果 */
    28         }
    29         else                         /* 如果是子串 */
    30         {
    31             count++;
    32             i--;           /* 因为返回for循环之后,进行下一次循环的时候还要进行i++的运算的 */
    33         }
    34     }
    35 
    36     return count;
    37 }
    38 
    39 
    40 int main()
    41 {
    42     char* str_in = "i want to be a excellent programmers ";
    43     char* str_sub = "want";
    44     char str_out[100] = { 0 };
    45 
    46     int   count = Mysubstring(str_in, str_sub, str_out);
    47 
    48     printf("子串:%s\n", str_sub);
    49     printf("个数:%d\n", count);
    50     printf("原串:%s\n", str_in);
    51     printf("结果:%s\n", str_out);
    52 
    53     return 0;
    54 
    55 }

     

    转载于:https://www.cnblogs.com/cyyz-le/p/11181975.html

    展开全文
  • 题目:输入两个字符串第一字符串删除第二个字符串中所有的字符。例如, 输入‖They are students.‖和‖aeiou‖,则删除之后的第一个字符串变成‖Thy r stdnts.‖。  其实这类题有个特点,字符串中的字符...

    题目:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如, 输入‖They are students.‖和‖aeiou‖,则删除之后的第一个字符串变成‖Thy r stdnts.‖。 

    其实这类题有个特点,字符串中的字符分为两类,就可以联想快速排序里的将当前的数组分为左右两组,其中左边的数字小于某值,右边的数字大于某值。这种大于和小于就是将分为两类。当然,等于也是,但是可以忽略。 还有一道面试题,将int数组转换为奇数偶数各一边。 这道题就是将字符分为在删除字符串中 和不在删除字符串中两种。

    //题目:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。
    #include <iostream>
    using namespace std;
    #define N	15
    
    void deleteDestChar(char source[], char dest[], char result[])
    {
    	bool del[128] = {false};//创建一个bool型数组,作为一种判断的依据,类似hash表
    	int srcLen = strlen(source);
    	int destLen = strlen(dest);
    	for (int i = 0; i < destLen; i++)
    	{
    		del[dest[i]] = true;
    	}
    	
    	int j = 0;
    	for (int i = 0; i < srcLen; i++)
    	{
    		if (del[source[i]] == false)
    		{
    			result[j] = source[i];
    			j++;
    		}
    	}
    	while (j < N)
    	{
    		result[j] = '\0';
    		j++;
    	}
    }
    
    int main()
    {
    	char source[] = "They are students";
    	char dest[] = "aeiou";
    	char result[N];
    	deleteDestChar(source, dest, result);
    	cout<<result<<endl;
    }


    展开全文
  • 题目:输入两个字符串第一字符串删除第二个字符串中所有的字符。例如, 输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”。   其实这类题有个特点,字符串中的...

    题目:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,
    输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r
    stdnts.”。

     

    其实这类题有个特点,字符串中的字符分为两类,就可以联想快速排序里的将当前的数组分为左右两组,其中左边的数字小于某值,右边的数字大于某值。这种大于和小于就是将分为两类。当然,等于也是,但是可以忽略。

    还有一道面试题,将int数组转换为奇数偶数各一边。

    这道题就是将字符分为在删除字符串中 和不在删除字符串中两种。

     

     

    public static void delete(String source, String dest){   
            boolean[] del = new boolean[128];   
            Arrays.fill(del, false);   
            char[] src = new char[source.length()];   
            src = source.toCharArray();   
            int j = 0;   
            for(int i=0; i<dest.length(); i++){   
                del[dest.charAt(i)] = true;   
            }   
            for(int i=0; i<source.length(); i++){   
                char c = source.charAt(i);   
                if(!del[c]){   
                    src[j] = c;   
                    j++;   
                       
                }   
            }   
            System.out.println(new String(src,0, j));   
               
        }   

    展开全文
  • 题目:输入两个字符串第一字符串删除第二个字符串中所有的字符。例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy rstdnts.”。   其实这类题有个特点,字符串中的字符...

    题目:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,
    输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r
    stdnts.”。

     

    其实这类题有个特点,字符串中的字符分为两类,就可以联想快速排序里的将当前的数组分为左右两组,其中左边的数字小于某值,右边的数字大于某值。这种大于和小于就是将分为两类。当然,等于也是,但是可以忽略。

    还有一道面试题,将int数组转换为奇数偶数各一边。

    这道题就是将字符分为在删除字符串中 和不在删除字符串中两种。

     

    public static void delete(String source, String dest){
    		boolean[] del = new boolean[128];
    		Arrays.fill(del, false);
    		char[] src = new char[source.length()];
    		src = source.toCharArray();
    		int j = 0;
    		for(int i=0; i<dest.length(); i++){
    			del[dest.charAt(i)] = true;
    		}
    		for(int i=0; i<source.length(); i++){
    			char c = source.charAt(i);
    			if(!del[c]){
    				src[j] = c;
    				j++;
    				
    			}
    		}
    		System.out.println(new String(src,0, j));
    		
    	}
    	

     

    展开全文
  • 删除特定字符

    千次阅读 2006-05-26 21:28:00
    [题目]:用 C/C++语言编写一个高效率的函数来删除字符串里给定的字符集。这个函数的调用模型如下: viod removechars (char str[], char remove[])注意,remove中的所有字符都必须str中删除干净。例如,如果str是...
  • varchar2 1~4000字节 可变长度字符串,与CHAR类型相比,使用VARCHAR2可以节省磁盘空间,但查询效率没有char类型高 数值类型 Number(m,n) m(1~38) n(-84~127) 可以存储正数、负数、零、定点数和精度为38位的浮点数...
  • VB.NET利用正则表达式巧妙限制字符输入

    千次阅读 热门讨论 2014-07-17 20:46:10
    有时候甚至还需要从字符串中寻找特定的部分,或者对某一部分进行替换、删除等等。 使用传统的字符串函数判断方法或静态字符串操作方法,费时费力,且只能查找字符串中固定不变的部分,缺乏灵活性。 那有什么简单实用...
  • 定义正则表达式是一个特殊的字符序列,能方便的检查一个字符串是否与某种模式匹配。re模块使得python拥有全部的正则表达式功能。用途通过使用正则表达式,可以:测试字符串内的模式...基于模式匹配从字符串中提取子...
  • 在有些iOS app中需要用到textfield格式化输入、删除、插入,比如银行卡号6215 8888 ...重写编辑框的委托函数在里面进行实时监控编辑框内容的变化每次字符编辑后用一个特定的函数对字符串格式化再显示和提交考虑了中间
  • python 3

    2020-12-04 11:25:31
    ## 字符串切片 提取 切片(取其中某段) 变量[开始:结束:步进],中括号[]...字符串删除 strip()默认删除行首或者行尾的空白符(包括’\n’, ‘\r’, ‘\t’, ’ ') 切片提取进行删处 字典 一. 字典的定义  Pytho
  • 说到单元测试,引用《单元测试之道C#版》里面的一段话: 单元测试是开发者编写的一小段代码,用于检验被测代码的一个很小的...或者,你可能会从字符串删除匹配某种模式的字符,然后确认字符串确实不再包含这些字符了
  • 实例051 自动删除非法字符 55 实例052 为TextBox控件添加列表选择框 57 2.2 Button控件应用 58 实例053 在Button按钮中显示图标 58 2.3 ComboBox控件应用 59 实例054 将数据表中的字段添加到ComboBox控件...
  • (3)、如果你想使用列表的元素的话,直接使用下标取出即可,注意数字和字符串的转换。 示例如下: 执行结果: 1.2 添加,修改和删除元素 (1) 可以使用append()和insert()方法添加元素。其中append()是按顺序...
  • c# 加密和解密相关代码

    热门讨论 2011-09-06 11:04:59
    字符串中查找指定字符时,可以先将字符串显示在richTextBox 控件中,然后利用richTextBox 类的Find 方法在该控件中查找指定字符。在字符串中查找指定字符的代码如下: 第19章 加密与解密技术 833 M_int_index = ...
  • 用某行内容替换特定字符.cmd 统计重复次数并排序.cmd 计算字符串长度.cmd 读取带敏感字符的行.cmd 输出指定行的内容.cmd 过滤敏感字符.cmd 过滤相同行内容.cmd 还原QQ上复制下来的内容.cmd 逐行逐字显示文本.cmd ...
  • 用某行内容替换特定字符.cmd 百度关键字搜索.bat 禁止保留文档记录.bat 篮球飞人火爆版.cmd 系统文件替换.cmd 系统补丁自动升级.cmd 系统补丁自动安装.cmd 绑定网关的批处理及预留维护提到.bat 结束进程.bat...
  • 用某行内容替换特定字符.cmd 用随机数做四则运算.cmd 画圆角矩形框.cmd 百度关键字搜索.bat 百钱买百鸡的买法.cmd 禁止保留文档记录.bat 简介.txt 篮球飞人火爆版.cmd 系统补丁自动升级.cmd 系统补丁自动安装.cmd ...
  • 如何把单元格中的数字提取出来(字符串中不连续) 数字在字符串中不连续如何提取数字 用如何提取“-”前后的字符 怎样删去﹕后的文字 怎样只取“.”之后的文字﹖ 获取单元格内容中字符串 如何提取一串数字中的几位...
  • JavaScript王者归来

    2014-11-05 13:59:25
    9.2.4 字符串的模式匹配--一个字符串格式校验的例子 9.2.5 其他方法 9.3 字符串与字符数组 9.4 字符串与文本处理--JavaScript棋谱阅读器(一) 9.4.1 需求分析--什么是棋谱和棋谱阅读器 9.4.2 系统设计--棋谱和棋盘...
  • EXCEL函数公式集

    热门讨论 2010-03-16 03:26:38
    如何把单元格中的数字提取出来(字符串中不连续) 数字在字符串中不连续如何提取数字 用如何提取“-”前后的字符 怎样删去﹕后的文字 怎样只取“.”之后的文字﹖ 获取单元格内容中字符串 如何提取一串数字中的几位...
  • 5.2 怎样在程序获得一个空指针? 5.3 用缩写的指针比较“if(p)”检查空指针是否有效?如果空指针的内部表达不是0会怎样? NULL宏 5.4 NULL是什么,它是怎么定义的? 5.5 在使用非零位模式作为空指针的内部表示...
  • 《你必须知道的495个C语言问题》

    热门讨论 2010-03-20 16:41:18
    书中列出了C用户经常问的400多个经典问题,涵盖了初始化、数组、指针、字符串、内存分配、库函数、C预处理器等各个方面的主题,并分别给出了解答,而且结合代码示例阐明要点。 《你必须知道的495个C语言问题》结构...
  • previous up contents next C 语言常见问题集 原著:Steve Summit 翻译:朱群英, 孙 云 修订版 0.9.4, 2005年6月23日... o 8.6 我有个函数, 本该返回一个字符串, 但当它返回调用者的时候, 返回串却是垃圾信息。 ...
  • 5.2 怎样在程序获得一个空指针? 54 5.3 用缩写的指针比较“if(p)”检查空指针是否有效?如果空指针的内部表达不是0会怎样? 55 NULL 宏 56 5.4 NULL是什么,它是怎么定义的? 56 5.5 在使用非零位模式...
  • 基于socket的文件传输

    2017-08-18 07:11:35
    debug的时候发现用来将要发送的文件内容读取的缓冲区的内容是 无效的字符串 ,按道理来说用ios::binary打开的文件应该是统一的二进制流文件,但是为什么有些字符无法读到缓冲区(字符型数组)呢?望大神能够指点...
  • 如何将十进制字符串、十六进制字符串和二进制字符串互相转化 如何随机选号 第15章 发布程序 如何给软件加密和解密 如何使程序在开机时就自动运行 如何创建快捷方式 如何删除快捷方式 如何在程序中用代码注册和卸载...
  • 如果行首匹配,可以用“^”来实现,不过 EditPlus 有另一个功能可以很简单的删除行首的字符串 a. 选择要操作的行 b. 编辑-格式-删除行注释 c. 在弹出对话框里面输入要清除的行首字符,确定 【4】正则表达式应用...
  • 2009达内SQL学习笔记

    2010-02-10 19:46:58
    (单引号,引起字符串;双引号,引起别名。起别名有符号,或者区分大小写时,必须用双引号) 多表查询时,可给表起别名。(给列起别名,列<空格>列别名;给表起别名,表<空格>表别名;)。 如:Select first_name ...

空空如也

空空如也

1 2 3 4 5
收藏数 100
精华内容 40
关键字:

从字符串里删除特定字符串