精华内容
下载资源
问答
  • 【多选题】下列运算符的使用正确的有哪些( )【多选题】以下选项中,不符合 Python 语言变量命名规则的有( )【单选题】以下程序的输出结果是________ s = "python 编程 很 容易 学" print(len(s))【多选题】...

    【多选题】下列运算符的使用正确的有哪些( )

    【多选题】以下选项中,不符合 Python 语言变量命名规则的有( )

    【单选题】以下程序的输出结果是________ s = "python 编程 很 容易 学" print(len(s))

    【多选题】以下的布尔代数运算正确的是( )

    【单选题】关于 Python 语句 P = –P,以下选项中描述正确的是________

    【单选题】下列不是Python语言关键字的是________

    【简答题】身份认同是对自身的认知,当你对“我是谁”有个清晰的概念时,你就能对将来想要的生活有个较好的规划。请简述对自己的认识和未来的展望。

    【多选题】下列表达式的值为False的是( )

    【单选题】下列表达式的运算结果是________ >>> a = 100 >>> b = False >>> a * b > -1

    【单选题】以下选项中,哪一个是Python语言中代码注释使用的符号?________

    【其它】自选某一主题查阅文献(必须有英文文献),撰写关于特殊儿童动作发展或康复训练相关的 文献综述 。 主题围绕关键词: 特殊儿童( Special Children )、自闭症( Autism 、 autistic disorder 、 ASD )、多动症( attention deficit hyperactivity disorder 、 ADHD )、脑瘫 (cerebral palsy) 、 Learning disorder 等各类特殊儿童; 或运动康复( Exercise Rehabilitation ),作业治疗( occupational therapy ),物理治疗( Physical Therapy )等; 或粗大动作( Gross motor ),精细动作( Fine motor 、 fine movement ),平衡能力( Balance ability )、步态训练( gait training )、关节活动( joint motion ),针对各种特殊儿童的核心症状或问题行为等等; 或动作发展( motor development 、 movement 、 motion )、动作心理等。

    【单选题】下面代码的执行结果是________ >>> x = 2 >>> x *= 3 + 5**2

    【单选题】9//2 表达式输出结果为________

    【多选题】Python的数字类型包括( )

    【单选题】字符串是一个字符序列,例如,字符串s,从右侧向左第3个字符用________索引。

    【单选题】x 的 y 次方(xy) 以下表达式正确的是________

    【判断题】已知 x, y = 3, 5,那么执行x, y = y, x 之后,x的值为15。

    【单选题】Python关系运算符中表示“不等于”的是哪个?________

    【单选题】已知 x = 3,那么执行语句 x += 6 之后,x的值为________

    【单选题】下面________不是合法的的变量名。

    【其它】主题插画设计(1920*1080PX) 表情包设计(30个) 专业形象设计(10个) 三类任选其一,每一类都要有设计说明。

    【单选题】给出如下代码: TempStr = "Hello World" 以下选项中可以输出“World”子串的是________

    【多选题】关于赋值语句的作用,错误的描述是( )

    【多选题】以下对 Python 程序设计风格描述正确的选项是( )

    【其它】根据如图所示,绘制窗台相关图纸,并标注。

    【单选题】下列不合法的Python变量名是________

    【多选题】Python中布尔变量的值为( )

    【多选题】关于 Python 语言的注释,以下选项中描述正确的是( )

    【多选题】Python中的关系运算符有( )

    【单选题】下列________不是Python的数据类型。

    【单选题】字符串是一个连续的字符序列,用________方式打印出可以换行的字符串。

    【多选题】Python支持的数据类型有( )

    【多选题】以下选项属于 Python 整数类型的是( )

    【多选题】下列合法的Python变量名是( )

    【多选题】下列哪些语句在Python中是合法的( )

    【多选题】关于Python语言数值操作符,以下选项中描述正确的是( )

    【单选题】下面________不是Python合法的标识符

    【单选题】3*1**3 表达式输出结果为________

    【其它】返回 我校标志性建筑矢量图制作评分后无法再次提交修改文件

    【多选题】关于 Python 的数字类型,以下选项中描述正确的是( )

    【其它】请在45分钟内,完成建筑平面图的绘制。 要求: 图形数据准确; 标注、文字、图层设置正确; 标注清晰,图面美观。 提交:请用姓名+建筑平面图命名。 07.dwg

    【多选题】以下关于 Python 字符串的描述中,正确的是( )

    【其它】根据CAD原文件绘制别墅立面图:如图 别墅立面图002.dwg

    【多选题】Python 中对变量描述正确的选项是( )

    【多选题】关于字符串,下列说法正确的是( )

    【多选题】Python中的注释符有哪几种?( )

    【单选题】下面代码的输出结果是________ x=10 y=3 print(x%y,x**y)

    【单选题】22 % 3 表达式输出结果为________

    【多选题】关于a or b的描述正确的有哪些( )

    【单选题】Python中布尔形变量的值为________

    展开全文
  • 本次学习的是有关字符串方面的操作,方便大家学习,可以参照API阅读此类的各个方法知识。 API链接如下:https://pan.baidu.com/s/1_DMTYTstbDtfdjutBE3h8Q 提取码:elgp 字符串广泛应用 在Java 编程中,在 Java ...

    一、前言

    前面,我们整体学习了有关文件操作方面的知识,实现了检测、新建、修改文件并写入或者复制移动的操作。本次学习的是有关字符串方面的操作,为方便大家学习,可以参照API阅读此类的各个方法知识。

    API链接如下:https://pan.baidu.com/s/1_DMTYTstbDtfdjutBE3h8Q 提取码:elgp

    字符串广泛应用 在Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串。

    二、任务学习

    任务要求:

    • 完成一个java application应用程序,完成字符串的各种操作。
    • 操作包括字符串的初始化赋值输出
    • 操作包括两个字符串相加合成为一个新字符串。
    • 操作包括两个字符串比较其是否相同。
    • 操作包括已知一个字符串,查找某一子字符串是否被包含在此字符串之中,如果包含,包含了多少次
    • 操作包括已知一个字符串及其包含的某一子字符串,把此子字符串替换为其他的新的指定字符串。

    1)分析学习:

    1.1 字符串的初始化赋值和输出
    1. String类又称作不可变字符序列。

    2. String位于java.lang包中,Java程序默认导入java.lang包下的所有类。

    3. Java字符串就是Unicode字符序列,例如字符串“Java”就是4个Unicode字符’J’、’a’、’v’、’a’组成的。

    4. Java没有内置的字符串类型,而是在标准Java类库中提供了一个预定义的类String,每个用双引号括起来的字符串都是String类的一个实例。
      1

    1.2 将两个字符串合并为新字符串

    Java允许使用符号"+"把两个字符串连接起来。
    例:

    String s1 = "Hello";
    String s2 = "World! ";
    String s = s1 + s2; //HelloWorld!
    

    符号"+“把两个字符串按给定的顺序连接在一起,并且是完全按照给定的形式。
    当”+"运算符两侧的操作数中只要有一个是字符串(String)类型,系统会自动将另一个操作数转换为字符串然后再进行连接
    例:

    int age = 18;
    String str = "age is" + age;  //str赋值为"age is 18"
    //这种特性通常被用在输出语句中:
    System.out.println("age  is" + age);//age is 18
    
    1.3 比较两个字符串是否相同

    ==”代表比较双方是否相同。如果是基本类型则表示值相等,如果是引用类型则表示地址相等即是同一个对象。

    覆盖类 Object 中的 equals

    Object类中定义有:public boolean equals(Object obj)方法,提供定义“对象内容相等”的逻辑。比如,我们在公安系统中认为id相同的人就是同一个人、学籍系统中认为学号相同的人就是同一个人。

    Object 的 equals 方法默认就是比较两个对象的hashcode,是同一个对象的引用时返回 true 否则返回 false

    JDK提供的一些类,如String、Date、包装类等,重写了Object的equals方法,调用这些类的equals方法, x.equals (y) ,当x和y所引用的对象是同一类对象且属性内容相等时(并不一定是相同对象),返回 true 否则返回 false。

    equalsequalsIgnoreCase区别在于:后者将此 String 与另一个 String 比较,不考虑大小写。如果两个字符串的长度相同,并且其中的相应字符都相等(忽略大小写),则认为这两个字符串是相等的。
    在忽略大小写的情况下,如果下列至少一项为 true,则认为 c1 和 c2 这两个字符相同。
    7
    8

    1.4 查找字符串相互包含关系

    在字符串中查询某个char值时,此字符可以是单字母也可以是某个字符串,但是只有包含指定的char值时才会返回确定的查找值。
    9
    当我们需要查找子字符串出现的次数时,我们需要进行遍历查找切割判断

    方法很多,我们这里使用字符串截取的方案。使用indexOf来查找子字符串出现处的索引,用substring截取指导索引位置的字符串,即子串第一次出现的位置+长度=下一次的起始位置,如此循环查找,直至此字符串中没有这样的字符,则返回 -1退出循环语句。
    10
    11

    1.5 替换字符串中指定字符

    public String replace(char oldChar, char newChar)方法可以返回一个新字符串,这个新串是通过用newChar替换此字符串中出现的所有oldChar而生成的。
    12

    2)程序代码:

    为实现整体效果,本人将以上所提的方法写成总的一个程序,如下:

    /* 项目名称:Task_Du
     * 创建时间:2019年4月9日
     * 创建者:Administrator_wz
     * 创建地点:kmust
     * 功能:字符串的各项操作:赋值输出、对比合成、查找替换
     */
     import java.util.Scanner;//导入java.util包中的Scanner类
     public class stringTest1{//创建类名
    	public static void main(String[] args){//程序的主函数入口
    		//字符串的初始化赋值和输出
    		Scanner s1 = new Scanner(System.in);//获取键盘输入并赋值给s1字符串
           	System.out.println("请给字符串a赋值:");//输入提示信息
            String a = s1.nextLine();//定义字符串变量,并赋值为用户输入的信息
    		Scanner s2 = new Scanner(System.in);//获取键盘输入并赋值给s2字符串
    		System.out.println("请给字符串b赋值:");//输入提示信息
    		String b = s2.nextLine();//定义字符串变量,并赋值为用户输入的信息
    		System.out.println("字符串a的内容为:"+a);//输出字符串a赋值后的内容
    		System.out.println("字符串a的内容为:"+b);//输出字符串b赋值后的内容
    		//将两个字符串比较是否相同
    		System.out.println("两字符串的内容是否相同? "+a.equals(b));//输出结果信息
    		//System.out.println(a==b);        //比较两字符串是否同一个对象
    		//System.out.println(a.equals(b));  //比较两个字符串内容是否相同
    		//System.out.println(a.equalsIgnoreCase(b));//比较两个字符串(忽略大小写)
    		//将两个字符串相加合成为一个新字符串
    		String c = a + b;//合并两个字符串
    		System.out.println("字符串a与b合并之后的内容为:\n"+c);//输出合并字符串
    		//查找某一子字符串是否被包含在此字符串之中,如果包含,包含了多少次
    		Scanner s3 = new Scanner(System.in);//获取键盘输入并赋值给s3字符串
           	System.out.println("请输入想要查找的字符串:");//输入提示信息
            String d = s3.nextLine();//定义字符串变量,并赋值为用户输入的信息
    		boolean con =c.contains(d);//子字符串是否被包含在此字符串之中,包含输出true,否则输出false
    		System.out.println("子字符串是否被包含在此字符串之中:"+con);//输出结果信息
    		System.out.println("包含次数为:"+repetitions(c,d));//调用count,输出包含次数
    		//把此子字符串替换为其他的新的指定字符串。
    		Scanner s4 = new Scanner(System.in);//获取键盘输入并赋值给s4字符串
    		System.out.println("请选择是否替换字符(串):确定(1)/拒绝(2)");//提示选择查询方式
    		int e = s4.nextInt();//定义一个int类型变量,选择查询方式
    		switch(e){//查询方式类
    			case 1://查询类型1,替换字符(串)后输出
    				Scanner s5 = new Scanner(System.in);//获取键盘输入并赋值给s5字符串
    				System.out.println("请输入想要替换的原字符:");//输入提示信息
    				String f = s5.nextLine();//定义字符串变量,并赋值为用户输入的信息
    				Scanner s6 = new Scanner(System.in);//获取键盘输入并赋值给s6字符串
    				System.out.println("请输入想要替换的原字符:");//输入提示信息
    				String g = s6.nextLine();//定义字符串变量,并赋值为用户输入的信息
    				String z=c.replace(f,g);//将f替换为g
    				System.out.println("替换前:"+c);//输出替换前字符串信息
    				System.out.println("替换后:"+z);//输出替换后字符串信息
    				break;//跳出
    			case 2://查询类型2,不替换
    				System.out.println("最终的字符串内容为:\n"+c);//输出合并字符串
    				break;//跳出
    			default://输入有误项
    				System.out.println("该字符(串)有误");//输出错误提示
    				break;//跳出
    			}
    	} 	 
    	public static int repetitions(String c, String d) {//创建repetitions统计出现次数
    		int count = 0;//创建一个计数器,统计次数
    		int fromIndex = 0;//创建计数器,设开始的地址
    		while ((fromIndex = c.indexOf(d, fromIndex)) != -1) {// 循环到没有输出-1时就停止循环
    			fromIndex = fromIndex + d.length();//子串第一次出现的位置+长度=下一次的起始位置
    			count++;//次数加1
    		}
    		return count;//返回值
    	}
     }
    

    3)执行结果

    分部拆装效果见下:
    2
    3
    4
    String类常用的方法有(可到API中查看,部分前面也已讲过,此处不赘述):

    1. String类的下述方法能创建并返回一个新的String对象: concat()、 replace()、substring()、 toLowerCase()、 toUpperCase()、trim()

    2. 提供查找功能的有关方法: endsWith()、 startsWith()、 indexOf()、lastIndexOf()

    3. 提供比较功能的方法: equals()、equalsIgnoreCase()、compareTo()。

    4. 其它方法: charAt() 、length()。


    参考链接:
    https://blog.csdn.net/hacker754/article/details/78686212
    https://blog.csdn.net/u014259820/article/details/79654444
    https://blog.csdn.net/qq276295783/article/details/84947981
    https://blog.csdn.net/wufaliang003/article/details/74931375/
    https://blog.csdn.net/weixin_42014622/article/details/82988533
    https://blog.csdn.net/mingzhuo_126/article/details/83653422
    https://blog.csdn.net/P90X_Liyuan/article/details/79573294
    https://blog.csdn.net/jiaxianggege215/article/details/78206167


    展开全文
  • 字符串 https://ww2.mathworks.cn/help/matlab/characters-and-strings.html 创建字符向量 通过将字符序列括在单引号中来创建一个字符向量。 chr = 'Hello, world' chr = 'Hello, world' 字符向量 char 类型的...

    字符串

    https://ww2.mathworks.cn/help/matlab/characters-and-strings.html

     

    创建字符向量
    通过将字符序列括在单引号中来创建一个字符向量。
    chr = 'Hello, world'
    chr =
    'Hello, world'
    字符向量为 char 类型的 1×n 数组。在计算机编程中,字符串是表示 1×n 字符数组的常用术
    语。但是,从 R2016b 开始,MATLAB 同时提供 string 数据类型,因此 1×n 字符数组在
    MATLAB 文档中称为字符向量。
    whos chr
    Name Size Bytes Class Attributes
    chr 1x12 24 char
    如果文本包含单个引号,请在分配字符向量时放入两个引号。
    newChr = 'You''re right'
    newChr =
    'You're right'
    uint16 等函数将字符转换为其数值代码。
    chrNumeric = uint16(chr)
    chrNumeric =
    1×12 uint16 row vector
    72 101 108 108 111 44 32 119 111 114 108 100
    char 函数将整数向量重新转换为字符。
    chrAlpha = char([72 101 108 108 111 44 32 119 111 114 108 100])

     

    要将字符向量合并到二维字符数组中,请使用方括号或 char 函数。
    • 应用 MATLAB 串联运算符 []。使用分号 (;) 分隔每一行。每一行都必须包含相同数量的字
    符。例如,合并长度相同的三个字符向量:
    devTitle = ['Thomas R. Lee'; ...
    'Sr. Developer'; ...
    'SFTware Corp.']
    devTitle =
    3×13 char array
    'Thomas R. Lee'
    'Sr. Developer'
    'SFTware Corp.'
    如果字符向量的长度不同,请根据需要用空格字符填充。例如:
    mgrTitle = ['Harold A. Jorgensen '; ...
    'Assistant Project Manager'; ...
    'SFTware Corp. ']

     

     

    调用 char 函数。如果字符向量的长度不同,char 将用尾随空格填充较短的向量,以使每
    一行具有相同数量的字符。
    mgrTitle = char('Harold A. Jorgensen', ...
    'Assistant Project Manager', 'SFTware Corp.')
    mgrTitle =
    3×25 char array
    'Harold A. Jorgensen '
    'Assistant Project Manager'
    'SFTware Corp. '

    水平合并字符向量
    要将字符向量合并到一个行向量中,请使用方括号或 strcat 函数。
    • 应用 MATLAB 串联运算符 []。用逗号或空格分隔输入字符向量。此方法可保留输入数组中
    的任何尾随空格。
    name = 'Thomas R. Lee';
    title = 'Sr. Developer';
    company = 'SFTware Corp.';
    fullName = [name ', ' title ', ' company]
    MATLAB 返回
    fullName =
    'Thomas R. Lee, Sr. Developer, SFTware Corp.'


    调用串联函数 strcat。此方法可删除输入中的尾随空格。例如,组合字符向量以创建一个
    假设的电子邮件地址。
    name = 'myname ';
    domain = 'mydomain ';
    ext = 'com ';
    address = strcat(name, '@', domain, '.', ext)
    address =
    'myname@mydomain.com'

    使用以下任何函数标识字符数组,或者标识字符数组中的某些字符。
    函数 说明
    ischar 确定输入是否为字符数组
    isletter 查找输入字符数组中的所有英文字母
    isspace 查找输入字符数组中的所有空格字符
    isstrprop 查找特定类别的所有字符
    查找字符向量中的空格。
    chr = 'Find the space characters in this character vector';
    % | | | | | | |
    % 5 9 15 26 29 34 44
    find(isspace(chr))
    ans =
    5 9 15 26 29 34 44


    使用空格字符
    blanks 函数会创建一个包含空字符的字符向量。创建一个包含 15 个空格字符的向量。字符
    向量始终会显示在单引号之间。
    chr = blanks(15)
    chr =
    ' '
    在空白字符向量的中间插入一些非空格字符。
    chr(6:10) = 'AAAAA'
    chr =
    ' AAAAA '
    您可以使用 strjust 函数将这些字符的位置向左或向右对齐:
    chrLeft = strjust(chr,'left')
    chrLeft =
    'AAAAA '
    chrRight = strjust(chr,'right')
    chrRight =
    ' AAAAA'
    使用 deblank 删除所有尾随空格字符:
    chrDeblank = deblank(chr)
    chrDeblank =
    ' AAAAA'
    使用 strtrim 删除所有前导和尾随空格:
    chrTrim = strtrim(chr)
    chrTrim =
    'AAAAA'
     

    字符数组中的数据
    有时,字符表示的数据并不对应到文本,例如 DNA 序列。您可以将此类数据存储在数据类型
    为 char 的字符数组中。字符数组使用单引号。
    seq = 'GCTAGAATCC';
    whos seq
    Name Size Bytes Class Attributes
    seq 1x10 20 char
    数组的每个元素都包含单个字符。
    seq(4)
    ans =
    'A'
    使用方括号串联字符数组,就像串联数值数组一样。
    seq2 = [seq 'ATTAGAAACC']
    seq2 =
    'GCTAGAATCCATTAGAAACC'
    在字符串数组引入之前编写的程序中,字符数组很常见。接受 string 数据的所有 MATLAB 函
    数都能接受 char 数据,反之亦然

     

    创建字符串数组
    R2016b 中引入了字符串数组。字符串数组可存储文本片段,并提供一组用于将文本按数据进
    行处理的函数。您可以对字符串数组进行索引、重构和进行串联,就像处理任何其他类型的数
    组一样。此外,还可以访问字符串中的字符,并使用 plus 运算符向字符串追加文本。要重新
    排列字符串数组中的字符串,请使用 split、 join 和 sort 等函数。
    根据变量创建字符串数组
    MATLAB® 提供字符串数组来存储文本片段。字符串数组的每个元素都包含一个 1×n 字符序
    列。
    从 R2017a 开始,您可以使用双引号创建字符串。

    当您处理文本时,将字符序列括在双引号中。可以将文本赋给变量。
    t = "Hello, world";
    如果文本包含双引号,请在定义中使用两个双引号。
    q = "Something ""quoted"" and something else."
    q =
    "Something "quoted" and something else."

     

    作为备选方法,您可以使用 string 函数将字符向量转换为字符串。 chr 为一个 1×17 字符向
    量。 str 为一个与该字符向量具有相同文本的 1×1 字符串。
    chr = 'Greetings, friend'
    chr =
    'Greetings, friend'
    str = string(chr)
    str =
    "Greetings, friend"
    使用 [] 运算符创建一个包含多个字符串的字符串数组。 str 是一个 2×3 字符串数组,其中包
    含六个字符串。
    str = ["Mercury","Gemini","Apollo";
    "Skylab","Skylab B","ISS"]
    str = 2x3 string array
    "Mercury" "Gemini" "Apollo"
    "Skylab" "Skylab B" "ISS"

     

    作为备选方法,您可以使用 string 函数将字符向量元胞数组转换为字符串数组。MATLAB 使
    用双引号显示字符串数组中的字符串,使用单引号显示元胞数组中的字符向量。
    C = {'Mercury','Venus','Earth'}
    C = 1x3 cell array
    {'Mercury'} {'Venus'} {'Earth'}
    str = string(C)
    str = 1x3 string array
    "Mercury" "Venus" "Earth"

     

    要将文本添加到字符串的末尾,请使用加号运算符 +。
    f = 71;
    c = (f-32)/1.8;
    tempText = "Temperature is " + c + "C"
    tempText =
    "Temperature is 21.6667C"


    与数值数组类似,字符串数组可以有多个元素。使用 strlength 函数求数组中每个字符串的长
    度。
    A = ["a","bb","ccc"; "dddd","eeeeee","fffffff"]
    A =
    2×3 string array


    strlength(A)

     

    除了字符向量,您还可以使用 string 函数将数值、日期时间、持续时间和分类值转换为字符
    串。
    将数值数组转换为字符串数组。
    X = [5 10 20 3.1416];
    string(X)
    ans = 1x4 string array
    "5" "10" "20" "3.1416"


    将日期时间值转换为字符串。
    d = datetime('now');
    string(d)
    ans =
    "03-Feb-2019 10:12:54"

     

     

    将字符串串联到字符串数组中
    将字符串串联到字符串数组中,就像您串联任何其他类型的数组一样。
    使用方括号 [] 串联两个字符串数组。
    str1 = ["Mercury","Gemini","Apollo"];
    str2 = ["Skylab","Skylab B","ISS"];
    str = [str1 str2]
    str = 1x6 string array
    "Mercury" "Gemini" "Apollo" "Skylab" "Skylab B" "ISS"
    转置 str1 和 str2。将它们进行串联,然后将列标题垂直串联到字符串数组上。当您将字符向
    量串联到字符串数组中时,字符向量会自动转换为字符串。
    str1 = str1';
    str2 = str2';
    str = [str1 str2];
    str = [["Mission:","Station:"] ; str]
    str = 4x2 string array
    "Mission:" "Station:"
    "Mercury" "Skylab"
    "Gemini" "Skylab B"
    "Apollo" "ISS"

     

     

    字符串相关函数

    字符串数组

    string字符串数组
    strings创建不包含字符的字符串数组
    join合并字符串

    字符数组

    char字符数组
    cellstr转换为字符向量元胞数组
    blanks创建空白字符数组
    newline创建换行符

    字符或字符串数组

    compose将数据格式化为多个字符串
    sprintf将数据格式化为字符串或字符向量
    strcat水平串联字符串
    append合并字符串

    转换输入参数

    convertCharsToStrings将字符数组转换为字符串数组,其他数组不变
    convertStringsToChars将字符串数组转换为字符数组,其他数组不变
    convertContainedStringsToChars在元胞数组或结构体的任何级别转换字符串数组

    在数值和字符串之间转换

    double双精度数组
    string字符串数组
    str2double将字符串转换为双精度值
    num2str

    将数字转换为字符数组

     

    ischar确定输入是否为字符数组
    iscellstr确定输入是否为字符向量元胞数组
    isstring确定输入是否为字符串数组
    isStringScalar确定输入是否为包含一个元素的字符串数组

    文本属性

    strlength字符串长度
    isstrprop确定输入字符串中的哪些字符属于指定类别
    isletter确定哪些字符为字母
    isspace确定哪些字符是空白字符

    查找

    contains确定字符串中是否有模式
    count计算字符串中模式的出现次数
    endsWith确定字符串是否以模式结尾
    startsWith确定字符串是否以模式开头
    strfind在其他字符串中查找字符串
    sscanf从字符串读取格式化数据

    替换

    replace查找并替换一个或多个子字符串
    replaceBetween替换起点和终点之间的子字符串
    strrep

    查找并替换子字符串

     

    join合并字符串
    split在分隔符处拆分字符串
    splitlines在换行符处拆分字符串
    strjoin联接数组中的字符串
    strsplit在指定分隔符处拆分字符串或字符向量
    strtok所选的字符串部分
    erase删除字符串内的子字符串
    eraseBetween删除起点和终点之间的子字符串
    extractAfter提取指定位置后的子字符串
    extractBefore提取指定位置前的子字符串
    extractBetween提取起点和终点之间的子字符串
    insertAfter在指定的子字符串后插入字符串
    insertBefore在指定的子字符串前插入字符串
    pad为字符串添加前导或尾随字符
    strip删除字符串中的前导和尾随字符
    lower将字符串转换为小写
    upper将字符串转换为大写
    reverse反转字符串中的字符顺序
    deblank删除字符串末尾的尾随空白
    strtrim从字符串中删除前导和尾随空白
    strjust

    对齐字符串

     

    strcmp比较字符串
    strcmpi比较字符串(不区分大小写)
    strncmp比较字符串的前 n 个字符(区分大小写)
    strncmpi比较字符串的前 n 个字符(不区分大小写)
    regexp匹配正则表达式(区分大小写)
    regexpi匹配正则表达式(不区分大小写)
    regexprep使用正则表达式替换文本
    regexptranslate将文本转换为正则表达式

     

    数值类型

    整数和浮点数据

    MATLAB® 中的数值类包括有符号和无符号整数、单精度和双精度浮点数。

    默认情况下,MATLAB 以双精度浮点形式存储所有数值。(您不能更改默认类型和精度。)您可以选择以整数或单精度形式存储任何数值或数值数组。

    与双精度数组相比,以整数和单精度数组形式存储数据更节省内存。

    所有数值类型都支持基本的数组运算,例如添加下标、重构和数学运算。

    函数

    double双精度数组
    single单精度数组
    int88 位有符号整数数组
    int1616 位有符号整数数组
    int3232 位有符号整数数组
    int6464 位有符号整数数组
    uint88 位无符号整数数组
    uint1616 位无符号整数数组
    uint3232 位无符号整数数组
    uint6464 位无符号整数数组
    cast将变量转换为不同的数据类型
    typecast在不更改基础数据的情况下转换数据类型
    isinteger确定输入是否为整数数组
    isfloat确定输入是否为浮点数组
    isnumeric确定输入是否为数值数组
    isreal确定数组是否为实数数组
    isfinite确定数组元素是否为有限值
    isinf确定数组元素是否为无限值
    isnan判断查询数组元素是否包含 NaN 值
    eps浮点相对精度
    flintmax浮点格式的最大连续整数
    Inf创建所有值均为 Inf 的数组
    intmax指定整数类型的最大值
    intmin指定整数类型的最小值
    NaN创建所有值均为 NaN 的数组
    realmax最大的正浮点数
    realmin

    最小的标准正浮点数

     

     

     

    MATLAB 默认情况下以双精度浮点形式 (double) 存储数值数据。要以整数形式存储数据,您需要从 double 转换为所需的整数类型。使用上表中所示的转换函数之一。

    例如,如果要以 16 位有符号整数形式存储赋给变量 x 的值 325,请键入

    x = int16(325);
    

    如果要转换为整数的数值带有小数部分,MATLAB 将舍入到最接近的整数。如果小数部分正好是 0.5,则 MATLAB 会从两个同样临近的整数中选择绝对值大小更大的整数:

    x = 325.499;
    int16(x)
    ans =
    	
      int16
    
       325         
    
    x = x + .001;
    int16(x)
    ans =
    
      int16
    
       326  

    在将其他类(例如字符串)转换为整数时,这些整数转换函数也很有用:

    str = 'Hello World';
    
    int8(str)
    ans =
    
      1×11 int8 row vector
    
        72   101   108   108   111    32    87   111   114   108   100

    如果您将 NaN 值转换为整数类,则结果为该整数类中的 0 值。例如,

    int32(NaN)
    ans =
    
      int32
    
       0

     

    数值的显示格式
    默认显示
    默认情况下,MATLAB® 将数值输出显示为 5 位数的定标定点值。您可以将数值的显示方式更改为以下任意方式:

    5 位数的定标定点、浮点或这两种方式中的最佳方式

    15 位数的定标定点、浮点或这两种方式中的最佳方式

    小整数的比率

    十六进制(以 16 为基数)

    Bank 表示法

    format 参考页中列出了所有可用格式。

    要更改数值显示设置,请使用 format 函数或预设对话框(可通过 MATLAB 文件菜单访问)。format 函数只在单个 MATLAB 会话期间更改数值的显示方式,
    而您的“预设”设置则会从一个会话到下一个会话都保持活动状态。这些设置仅影响数值的显示方式,而不影响 MATLAB 计算或保存数值的方式。
    为 x 设置一个整数值并以十六进制(以 16 为基数)格式显示:

    format hex
    x = uint32(876543210)
    x =
       343efcea


    将格式设置为 5 位数的浮点格式:

    format short e
    x
    x =
       1.3333e+00   1.2345e-06


    设置 x 的值并以 5 位数的定标定点格式显示:

    x = [4/3 1.2345e-6]
    x =
        1.3333    0.0000
     

     

     

    确定数值类
    您可以使用以下任意命令检查变量 x 的数据类型。

    whos x

    显示 x 的数据类型。

    xType = class(x);

    将 x 的数据类型赋予变量。

    isnumeric(x)

    确定 x 是否为数值类型。

    isa(x, 'integer')
    isa(x, 'uint64') 
    isa(x, 'float') 
    isa(x, 'double') 
    isa(x, 'single')

    确定 x 是否为指定的数值类型。(此处显示了任意整数、无符号的 64 位整数、任意浮点数、双精度数和单精度数的示例)。

    isreal(x)

    确定 x 是实数还是复数。

    isnan(x)

    确定 x 是否不是数值 (NaN)。

    isinf(x)

    确定 x 是否为无限值。

    isfinite(x)

    确定 x 是否为有限值。

     

    合并不同的整数类型
    概述
    如果您在矩阵中合并不同的整数类型(例如有符号与无符号,或 8 位整数与 16 位整数),MATLAB® 将返回所有元素都属于一个公共类型的矩阵。MATLAB 将生成矩阵的所有元素设置为输入矩阵中的最左侧元素的数据类型。例如,以下串联生成由 3 个 16 位有符号整数组成的向量:

    A = [int16(450) uint8(250) int32(1000000)]
    合并不同大小的整数的示例
    禁用如上所示的整数串联警告后,一次串联下面的两个数字,然后转换它们的顺序。返回值取决于整数的串联顺序。最左侧的类型决定着向量中的所有元素的数据类型:

    A = [int16(5000) int8(50)]
    A =
       5000   50

    B = [int8(50) int16(5000)]
    B =
       50   127
    第一个操作返回由 16 位整数组成的向量。第二个操作返回由 8 位整数组成的向量。元素 int16(5000) 设置为 127,即 8 位有符号整数的最大值。

    相同规则也适用于垂直串联:

    C = [int8(50); int16(5000)]
    C =
        50
       127
    合并有符号与无符号整数的示例
    现在使用有符号与无符号整数做相同的练习。同样,最左侧的元素决定着生成矩阵中的所有元素的数据类型:

    A = [int8(-100) uint8(100)]
    A =
       -100   100

    B = [uint8(100) int8(-100)]
    B =
       100   0
    元素 int8(-100) 设为零,因为它不再有符号。

    MATLAB 在将每个元素串联为一个合并数组之前计算每个元素。换句话说,在合并两个元素前,以下语句的计算结果为一个 8 位有符号整数(等于 50)和一个 8 位无符号整数(无符号的 -50 设为零)。按照该串联,第二个元素保留其零值,但采用无符号 int8 类型:

    A = [int8(50), uint8(-50)]
    A =
      50    0

     

    数据类型检测函数

    函数

    iscalendarduration确定输入是否为日历持续时间数组
    iscategorical确定输入是否为分类数组
    iscell确定输入是否为元胞数组
    iscellstr确定输入是否为字符向量元胞数组
    ischar确定输入是否为字符数组
    isdatetime确定输入是否为日期时间数组
    isduration确定输入是否为持续时间数组
    isenum确定变量是否为枚举
    isfloat确定输入是否为浮点数组
    isgraphics对有效的图形对象句柄为 True
    isinteger确定输入是否为整数数组
    isjava确定输入是否为 Java 对象
    islogical确定输入是否为逻辑数组
    isnumeric确定输入是否为数值数组
    isobject确定输入是否为 MATLAB 对象
    isreal确定数组是否为实数数组
    isstring确定输入是否为字符串数组
    isstruct确定输入是否为结构体数组
    istable确定输入是否为表
    istimetable确定输入是否为时间表
    is*检测状态
    isa确定输入是否具有指定数据类型
    class对象的类
    validateattributes检查数组的有效性
    whos列出工作区中的变量及大小和类型

     

     

     

    数据类型转换

    数值数组、字符数组、元胞数组、结构体或表格之间的转换

    函数

    char字符数组
    cellstr转换为字符向量元胞数组
    int2str将整数转换为字符
    mat2str将矩阵转换为字符
    num2str将数字转换为字符数组
    str2double将字符串转换为双精度值
    str2num将字符数组或字符串转换为数值数组
    native2unicode将数值字节转换为 Unicode 字符表示形式
    unicode2native将 Unicode 字符表示形式转换为数值字节
    base2dec将以 N 为基数表示数字的文本转换为十进制数字
    bin2dec将用文本表示的二进制数字转换为十进制数字
    dec2base将十进制数字转换为以 N 为基数的数字的字符向量
    dec2bin将十进制数字转换为表示二进制数字的字符向量
    dec2hex将十进制数字转换为表示十六进制数字的字符向量
    hex2dec将十六进制数字的文本表示形式转换为十进制数字
    hex2num将 IEEE 十六进制字符串转换为双精度数字
    num2hex将单精度和双精度值转换成 IEEE 十六进制字符串
    table2array将表转换为同构数组
    table2cell将表转换为元胞数组
    table2struct将表转换为结构体数组
    array2table将同构数组转换为表
    cell2table将元胞数组转换为表
    struct2table将结构体数组转换为表
    cell2mat将元胞数组转换为基础数据类型的普通数组
    cell2struct将元胞数组转换为结构体数组
    mat2cell将数组转换为在元胞中包含子数组的元胞数组
    num2cell将数组转换为相同大小的元胞数组
    struct2cell将结构体转换为元胞数组

     

    函数摘要
    此表中列出的函数提供了多种将数值数据转换为字符数组的方法。

    函数说明示例
    char将正整数转换为等效的字符。(截断任何小数部分。)[72 105] → 'Hi'
    string将包含双精度值的数组转换为字符串数组。[72 105] → "72" "105"
    [3.1416 2.178] →
    "3.1416" "2.178"
    int2str将正整数或负整数转换为字符类型。(对任何小数部分
    四舍五入。)
    [72 105] → '72 105'
    num2str将数值类型转换为指定精度和格式的字符类型。[72 105] → '72/105/'
    (格式设置为 %1d/)
    mat2str将数值类型转换为指定精度的字符类型,并返回
    MATLAB 可以计算的字符向量。
    [72 105] → '[72 105]'
    dec2hex将正整数转换为字符类型的十六进制基数。[72 105] → '48 69'
    dec2bin将正整数转换为字符类型的二进制基数。[72 105] → '1001000
    1101001'
    dec2base将正整数转换为字符类型的数字,基数可从 2 到 36。[72 105] → '110 151'

     

    将数字转换为字符代码
    char 函数将整数转换为 Unicode 字符代码,并返回由对等字符构成的字符数组:
    6 字符和字符串
    6-56x = [77 65 84 76 65 66];
    char(x)
    ans =
    'MATLAB'

    将数字表示为文本
    int2str、 num2str 和 mat2str 函数将数值表示为文本,其中每个字符表示输入值中一位单
    独的数字。 int2str 和 num2str 函数常被用来为绘图添加标签。例如,下列线条使用
    num2str 为绘图的 x 轴准备自动化标签:
    function plotlabel(x, y)
    plot(x, y)
    chr1 = num2str(min(x));
    chr2 = num2str(max(x));
    out = ['Value of f from ' chr1 ' to ' chr2];


    转换为特定基数
    另一类转换函数将数值更改为字符数组,将十进制值用另一种基数形式表示,例如二进制或十
    六进制表示形式。这些函数包括 dec2hex、 dec2bin 和 dec2base。

     

    函数摘要
    此表中列出的函数提供了多种将字符数组转换为数值数据的方法。

    函数说明示例
    uintN(例如 uint8)将字符转换为表示该字符的整数代码。'Hi' → 72 105
    str2num将字符类型转换为数值类型。'72 105' → [72 105]
    str2double与 str2num 类似,但提供更佳的性能,用于处理
    字符串数组和字符向量元胞数组。
    "72" "105" → [72 105]
    {'72' '105'} → [72 105]
    hex2num将数值类型转换为指定精度的字符类型,并返回
    MATLAB 可以计算的字符数组。
    'A' → '-1.4917e-154'
    hex2dec将数值类型的十六进制基数转换为正整数。'A' → 10
    bin2dec将字符类型的二进制数字转换为十进制数字。'1010' → 10
    base2dec将字符类型的 2 到 36 内任何进制的数字转换为十
    进制数字。
    '12' → 10 (如果 base
    == 8)


    从特定基数转换
    要将非十进制数字的字符表示转换为该数字的值,请使用以下函数之一:hex2num、
    hex2dec、 bin2dec 或 base2dec。
    hex2num 和 hex2dec 函数都接受十六进制(以 16 为基数)输入,但 hex2num 返回它表
    示的 IEEE 双精度浮点数,而 hex2dec 则将输入转换为十进制整数

    展开全文
  • 1、字符串 1.1、属性 1.2、字母表 2、字符串排序方法 3、键索引计数法 3.1、第一步:频率统计 3.2、第二步:将频率转换索引 3.3、第三步:数据分类排序 3.4、第四步:回写排序好的数组 4、低位优先的字符...

    目录

    1、字符串

    1.1、属性

    1.2、字母表

    2、字符串排序方法

    3、键索引计数法

    3.1、第一步:频率统计

    3.2、第二步:将频率转换为索引

    3.3、第三步:数据分类排序

    3.4、第四步:回写排序好的数组

    4、低位优先的字符串排序

    5、高位优先的字符串排序

    5.1、优化-插入排序

    6、三向字符串快速排序

    7、所有排序算法性能对比


    1、字符串

    String 是由一系列字符组成的。字符的类型是 char,可能有 2的16次方个值。数十年以来, 程序员的注意力都局限于 7 位 ASCII 码(请见表 5.5.4)或是 8 位扩展 ASCII 码表示的字符,但许 多现代的应用程序都已经需要使用 16 位 Unicode 编码了。

    1.1、属性

    字符串String拥有以下属性:

    • 不可变性:String 对象是不可变的,因此可以将它们用于赋值语句、作为函数的参数或是返回值,而不用担心它们的值会发生变化。
    • 索引:我们最常完成的操作就是从某个字符串中提取一个特定的字符,即 Java 的 String 类的 charAt() 方法。
    • 子字符串:Java 的 substring() 方法实现了提取特定的子字符串的操作。
    • 字符串的连接:在 Java 中通过将一个字符串追加到另一个字符串的末尾创建一个新字符串的操 作是一个内置的操作(使用“+”运算符),所需的时间与结果字符串的长度成正比。

    1.2、字母表

    当我们在做一些关于字符串相关的算法时,常常会对字符串中字符的数量和内容做一些限制,只使用特定的字符来降低算法的难度,就比如BASE64 算法中限定的字符数量就是64个,ASCII字母表是128个。下图就是常用字母表的搜集,其中 R是字符的数量lgR则是表示一个索引所需要的比特数( 也就是需要用几位二进制数来表示字母的的排序索引)。

    2、字符串排序方法

    我们生活中,常常会需要给字符串排序的情况,就比如通讯录里边的名字排序等。接下来我们将要学习两类高效的排序方法。

    第一类方法会从右到左检查键中的字符。这种方法一般被称为低位优先(Least-Signi cant-Digit First,LSD)的字符串排序。如果将一个字符串看作一个 256 进制的数字,那么从右向左检查字符串就等 价于先检查数字的最低位。这种方法最适合用于键的长度都相同的字符串排序应用。

    第二类方法会从左到右检查键中的字符,首先查看的是最高位的字符。这些方法通常称为高位 优先(MSD)的字符串排序。高位优先的字符串排序的吸引人之处 在于,它们不一定需要检查所有的输入就能够完成排序。高位优先的字符串排序和快速排序类似, 因为它们都会将需要排序的数组切分为独立的部分并递归地用相同的方法处理子数组来完成排序。

    3、键索引计数法

    键索引计数法其实就是通过统计每个字符出现的频率,然后通过频率之和来转化成排序后的索引。

    简单来说就是 比如a出现了3次,b出现了4次,c出现了5次,那么b字母开头的字符串排序后的索引,肯定是从第四个索引开始的,c开头的字符串排序后的索引肯定是从第八个索引(a+b=7)开始的。这样我们将字符串数组中的每个字符串中的字母都按照这样的方式排序的话,那么整个数组就都排序好了。

    现在我们有20个学生,每个学生都有自己的分组编号(只有1、2、3、4 组),但是这些学生的名字的排序并不是按照组号的顺序排列的,所以我们需要将这20个学生的名字按照 组号的顺序排序好。

    下面的代码是我们学生的信息类。

     class Student{
            String name;
            int key; //组号
            public int key() {
                return key;
            }
        }

    3.1、第一步:频率统计

    这里我们创建一个大小为6的int数组 count,然后遍历每个学生,然后将组号出现的频率统计到count数组中。注意,我们这里没用组号作为索引,而是组号+1的形式作为索引。这里为什么要用组号+1的索引来统计,后面你就知道了。

    3.2、第二步:将频率转换为索引

    看上面的数据,我们发现1组的人有3个,2组的人有5个,3组的人有6个。那么,1组人的索引从0开始,2组人的索引从3开始,3组人的索引从8开始。我们发现每个组的开始索引都是前面组的人数的和。利用这点我们可以对count数组中的统计数据进行转换。

    3.3、第三步:数据分类排序

    看上面的数据我们可以发现,count数组中count[1]=0 对应着1组人员开始的索引,count[2]=3 对应着2组人员开始的索引,count[3]=8 对应着3组人员开始的索引。然后我们只需要一个辅助数组aux[],将原来数组的数据按照count中对应的索引,开始标记转移到aux[]数组中,并对相同的元素进行++,就可以得到组号的排序数据了。

    3.4、第四步:回写排序好的数组

    在进行完上面的三步之后,aux[]数组中的数据已经是排序好的数据了,我们只需要将这些数组按照排序好的顺序复制回原来的数组,这样我们就算排序完成了。

    命题 A:键索引计数法排序 N 个键为 0 到 R-1 之间的整数的元素需要访问数组 11N + 4R+1 次。

    证明:根据代码可得,初始化数组会访问数组 N+R+1 次。在第一次循环中,N 个元素均会使 计数器的值加 1(访问数组 2N 次);第二次循环会进行 R 次加法(访问数组 2R 次);第三 次循环会使计数器的值增大 N 次并移动 N 次数据(访问数组 3N 次);第四次循环会移动数 据 N 次(访问数组 2N 次)。所有的移动操作都维护了等键元素的相对顺序。

    public class GroupSort {
    
        static class Student {
            String name;
            int key; // 组号
            public Student(String name, int key) {
                this.name = name;
                this.key = key;
            }
            public int key() {
                return key;
            }
        }
    
        public static void sort(Student[] s) {
    
            int N = s.length;
            int R = 5;
            int[] count = new int[R + 1];
            Student[] aux = new Student[N];
            //第一步:频率统计
            for (int i = 0; i < N; i++) {
                count[s[i].key + 1]++;
            }
            //第二步:频率转换成索引
            for (int r = 0; r < R; r++) {
                count[r + 1] += count[r];
            }
            //第三步:数据分组排序
            for (int i = 0; i < N; i++) {
                aux[count[s[i].key]++] = s[i];
            }
            //第四步:回写排序好的数据
            for (int i = 0; i < N; i++) {
                s[i] = aux[i];
            }
        }
    
        public static void main(String[] args) {
    
            Student[] a = new Student[30];
            for (int i = 0; i < 30; i++) {
                a[i] = new Student("小子" + i, (int) (Math.random() * 4+1));
            }
            for (Student s : a) {
                System.out.println("name:" + s.name + "-key:" + s.key);
            }
            System.out.println("----------------");
            sort(a);
            for (Student s : a) {
                System.out.println("name:" + s.name + "-key:" + s.key);
            }
        }
    }
    

    4、低位优先的字符串排序

    低位优先意思就是从字符串的最右边的字符开始对字符串数据进行排序。

    该算法的思想就是利用了上面键索引计数法,上面将的键索引计数法是通过一个字符对数据进行排序的,我们这里的低位优先的排序方法是对于多个字符进行排序的,就比如有一个用拍照的字符串组成的一个字符串数组,如果我们想要将它们排序的话,就得将每个字符都进行排序,最后得到一个整体的排序数组。

    这里你有可能会不明白一点,为啥每个字符都排序后,整个字符串就排序好了呢?

    这是因为假设这有四个字符串:  ACD、BAD、CAB、ABC 

    我们先讲最后一个字符排序得到的顺序是:CAB、ABC、ACD、BAD

    然后我们将第二个字符排序得到的顺序是:CAB、BAD、ABC、ACD

    然后我们将第三个字符排序得到的顺序是:ABC、ACD、BAD、CAB

    我们可以看到刚开始ABC是在ACD的后面,然后在对倒数第一个和倒数第二个字符排序的时候ABC移动到了ACD的前面。然后他们在对第一个字符排序的时候,他们前面排序好的相对位置是不变的,这样在我们对所有字符排序完之后,整个字符串数组就已经排序好了。

    对于基于 R 个字符的字母表的 N 个以长为 W 的字符串 为键的元素,低位优先的字符串排序需要访问 ~7WN + 3WR 次数组,使 用的额外空间与 N + R 成正比。

    从理论上说,低位优先的字符串排序的意义重大,因为它是一种适用 于一般应用的线性时间排序算法。无论 N 有多大,它都只遍历 W 次数据。 具体描述如上。但是它是有限制的,它相对于每个字符串都是有相同的长度来说都是相同的。当然也能进行改进,但是这样就失去了该算法的优势。

    public class LSD {
    
        public static void sort(String[] s,int W) {
    
            int N = s.length;
            int R = 128;  //字母和数字的字符最大的数值为127
            String[] aux = new String[N];
    
            for (int d = W - 1; d >= 0; d--) {
                int[] count = new int[R + 1];
                //第一步:频率统计
                for (int i = 0; i < N; i++) {
                    count[s[i].charAt(d) + 1]++;
                }
                //第二步:频率转换成索引
                for (int r = 0; r < R; r++) {
                    count[r + 1] += count[r];
                }
                //第三步:数据分组排序
                for (int i = 0; i < N; i++) {
                    aux[count[s[i].charAt(d)]++] = s[i];
                }
                //第四步:回写排序好的数据
                for (int i = 0; i < N; i++) {
                    s[i] = aux[i];
                }
            }
        }
    
        public static void main(String[] args) {
    
            String[] a = new String[20];
            for (int i = 0; i < 20; i++) {
                a[i]=getCharAndNumr(5);
            }
            for (String s : a) {
                System.out.println(" "+s);
            }
            sort(a,5);
            System.out.println("----------------");
            for (String s : a) {
                System.out.println(" "+s);
            }
        }
        /**
         * 随机生成指定长的字符串
         */
        public static String getCharAndNumr(int length) {
    
            Random random = new Random();
            StringBuilder valSb = new StringBuilder();
    //        String charStr = "0123456789abcdefghijklmnopqrstuvwxyz";
            String charStr = "ABCDE";
            int charLength = charStr.length();
    
            for (int i = 0; i < length; i++) {
                int index = random.nextInt(charLength);
                valSb.append(charStr.charAt(index));
            }
            return valSb.toString();
        }
    }

    上面代码中的R为什么是128呢?这是因为我们使用的字母+数字组成的字符串中,每个字符的数值最大不超过127。

    5、高位优先的字符串排序

    上面讲的是对于字符串长度相同的数组进行排序的方法,但是大多数情况下,我们需要排序的字符串数组中每个字符串的长度是不一样的,就比如对名字的排序。这时候我们就需要一个更加通用的排序方法。

    高位优先的字符串排序算法也是建立在键索引计数法的基础上完成的。但是不同的是它选择了递归的方式来不断对后面的字符进行比较,简单来说就是:

    假设有:ABC、BCBD、BC、BCC、BA、CAD 六个字符串,在第一轮利用键索引计数法将该数据进行排序后,还是如下顺序,第二步递归调用本身来对相同首字母的子字符串数组进行第二轮的键索引计数法,也就是会开头字母为A、B、C的字符串分成三组,然后再分别对各个子字符串数组进行键索引计数法排序,这样不断地递归下去,知道所有的字符串都排序完成为止。

    这里需要注意:因为每个字符串的长度不一样,如上述:BCBD、BC的前两个字符是相同,我们需要对第三个字符进行比较,但是第一个字符串只有两个字符,在第三轮比较中会超出自身的长度范围,这时候我们就需要一个方法来将BC排序BCBD的前面。

    这时候我们需要将count[0]的位置空出来给没有后序字符的字符串,来对这样的字符串进行统计频率,然后在频率转换为索引的时候因为它们在count数组的最前面,那么它们肯定排在有后序字符的字符串前面了。

    因为我们count数组本身就需要需要额外一个位置来统计最后一个字符的数量,这时候又得把0的位置空出来给没有字符的字符串,所以它初始化的时候为 new int[R+2]。

    public class MSD {
    
        private static int R = 127; //基数,字符的最大数值
        private static String aux[]; //辅助数组
    
        public static void sort(String[] a) {
            int N = a.length;
            aux = new String[N];
            sort(a, 0, N - 1, 0);
        }
    
        private static void sort(String[] a, int lo, int hi, int d) {
    
            if (hi <= lo)
                return;
            int[] count = new int[R + 2];
            // 第一步:频率统计
            for (int i = lo; i <= hi; i++) {
                count[charAt(a[i], d) + 2]++;
            }
            // 第二步:频率转换成索引
            for (int r = 0; r < R + 1; r++) {
                count[r + 1] += count[r];
            }
            // 第三步:数据分组排序,前面count+2,这里count+1
            for (int i = lo; i <= hi; i++) {
                aux[count[charAt(a[i], d) + 1]++] = a[i];
            }
            // 第四步:回写排序好的数据
            for (int i = lo; i <= hi; i++) {
                a[i] = aux[i - lo];
            }
            for (int r = 0; r < R; r++) {
                sort(a, lo + count[r], lo + count[r + 1] - 1, d + 1);
            }
        }
        /**
         * 如果该字符串的第d个字符为null,那么我们就需要将
         */
        private static int charAt(String s, int d) {
            if (d < s.length()) {
                return s.charAt(d);
            } else {
                return -1;
            }
        }
    
        public static void main(String[] args) {
    
            String[] a = new String[20];
            for (int i = 0; i < 20; i++) {
                a[i] = getCharAndNumr((int) (6 * Math.random() + 1));
            }
            for (String s : a) {
                System.out.println(" " + s);
            }
            sort(a);
            System.out.println("----------------");
            for (String s : a) {
                System.out.println(" " + s);
            }
        }
        /**
         * 随机生成指定长的字符串
         */
        public static String getCharAndNumr(int length) {
            Random random = new Random();
            StringBuilder valSb = new StringBuilder();
            String charStr = "ABCDE";
            int charLength = charStr.length();
            for (int i = 0; i < length; i++) {
                int index = random.nextInt(charLength);
                valSb.append(charStr.charAt(index));
            }
            return valSb.toString();
        }
    }

    该方法还是有一些弊端的:

    1. 子字符串数组:在递归的过程我们发现我们会将每个字符进行递归,如果这个数据量庞大,但是每个子字符串数组有很多,那么我们在时间和空间上都会有很大的折扣,这时候我们可以将子数组进行插入排序来提高效率。
    2. 等值键:如果我们有大量的相同的字符,就比如名字都相同,而且还很多,这样又切回不了插入排序,还必须得把每个字符都比较一遍,这也会让这个算法在那白浪费时间来排序一样的东西。
    3. 额外空间:该算法中我们用了两个辅助数组aux[]、 count[],aux[]只会创建一遍,但是count[]因为在递归中,创建所造成的空间浪费也是很大的。

    要将基于大小为 R 的字母表的 N 个字符串排序,高位优先的字符串排序算法平均需要 检查 NlogRN 个字符。

    要将基于大小为 R 的字母表的 N 个字符串排序,高位优先的字符串排序算法访问数 组的次数在 8N + 3R 到 ~7wN+3wR 之间,其中 w 是字符串的平均长度。

    5.1、优化-插入排序

    红框内的是相对于原始代码的改进部分,其他部分没改动。

    6、三向字符串快速排序

    对于高位优先的字符串排序,我们也能进行改进对其进行三向切分,但是高位优先的字符串排序可能会创建大量(空)子数组,而三向字符串快速排序的切 分总是只有三个。因此三向字符串快速排序能够很好处理等值键、有较长公共前缀的键、取值范围 较小的键和小数组——所有高位优先的字符串排序算法不善长的各种情况。

    特别重 要的一点是,这种切分方法能够适应键的不同部分的不同结构。和快速排序一样,三向字符串快速 排序也不需要额外的空间(递归所需的隐式栈除外),这是它相比高位优先的字符串排序的一大优点, 后者在统计频率和使用辅助数组时都需要空间。

    三向字符串排 序背后的核心思想是对首字母相同的键采取特殊的策略(也就是对首字母相同的键,进行)。

    算法-9-快速排序

    public class Quick3string {
    
        public static void sort(String[] a) {
            int N = a.length;
            sort(a, 0, N - 1, 0);
        }
    
        private static void sort(String[] a, int lo, int hi, int d) {
    
            if (hi<=lo) return;
            int left = lo, right = hi;
            int i = lo+1;
            int v = chartAt(a[lo], d);
    
            while (i <= right) {
    
                int w = chartAt(a[i], d);
                if (w > v) {
                    exch(a, i, right--);
                } else if (w < v) {
                    exch(a, i++, left++);
                } else {
                    i++;
                }
            }
    
            sort(a, lo, left - 1, d);
            if (v >= 0) {
                sort(a, left, right, d + 1);
            }
            sort(a, right + 1, hi, d);
    
        }
    
        private static void exch(String[] a, int v, int w) {
            String temp = a[v];
            a[v] = a[w];
            a[w] = temp;
        }
    
        private static int chartAt(String s, int d) {
            return d < s.length() ? s.charAt(d) : -1;
        }
    
        public static void main(String[] args) {
    
            String[] a = new String[20];
            for (int i = 0; i < 20; i++) {
                a[i] = getCharAndNumr((int) (6 * Math.random() + 1));
            }
            for (String s : a) {
                System.out.println(" " + s);
            }
            sort(a);
            System.out.println("----------------");
            for (String s : a) {
                System.out.println(" " + s);
            }
        }
        /**
         * 随机生成指定长的字符串
         */
        public static String getCharAndNumr(int length) {
            Random random = new Random();
            StringBuilder valSb = new StringBuilder();
            String charStr = "ABCDE";
            int charLength = charStr.length();
            for (int i = 0; i < length; i++) {
                int index = random.nextInt(charLength);
                valSb.append(charStr.charAt(index));
            }
            return valSb.toString();
        }
    }
    

    7、所有排序算法性能对比

     

     

    展开全文
  • 字符串即长度零的字符串,在代码里"零长度字符串"用一对没有间隔的英文引号''表示,它的数据类型是明确的即属于字符型。文中实际举例来区分两者。并且实现 1、对NULL的判断 2、对空字符串的判断 3、同时剔除null...
  • Python内置函数

    万次阅读 多人点赞 2019-05-10 15:10:36
    如果 source 为字符串,则按照指定的 encoding 将字符串转换字节序列; 如果 source 为可迭代类型,则元素必须[0 ,255] 中的整数; 如果 source 与 buffer 接口一致的对象,则此对象也可以被用于初始化 ...
  • 入门学习Linux常用必会60个命令实例详解doc/txt

    千次下载 热门讨论 2011-06-09 00:08:45
    文件doc版,可自行转成txt,在手机上看挺好的。 本资源来自网络,如有纰漏还请告知,如觉得还不错,请留言告知后来人,谢谢!!!!! 入门学习Linux常用必会60个命令实例详解 Linux必学的60个命令 Linux提供...
  • 前端面试题

    万次阅读 多人点赞 2019-08-08 11:49:01
    写出简单描述html标签(不带属性的开始标签和结束标签)的正则表达式,并将以下字符串中的html标签去除掉 70 完成foo()函数的内容,要求能够弹出对话框提示当前选中的是第几个单选框。 70 完成函数showImg(),...
  • 而输入空字符串,则是这里的“有对(列)变量输入数据”这一类情况,即有输入数据,只是输入的数据字符串(含有终止符的还是)。  数据库中的NULL和C++等语言中的NULL的区别:  数据库中的NULL是一个关键字
  • 4399前端笔试题2019

    万次阅读 热门讨论 2019-09-08 23:47:55
    localStorage.setItem("title_history",[...titles, "localStorageTitle"]) } 假设有一个字符串s,其长度最长1000,请编写函数 palindrome找到该字符串中最长的回文字符片段。 例1: s “cdcde”, 输出: “cdc”,...
  • color:用于指定颜色的...search:用于输入搜索字符串的单行文本字段。换行会被从输入的中自动移除。 tel:用于输入电话号码的控件。在移动端输入会显示数字键盘,PC端无效果 url:用于编辑URL的字段。
  • C#基础教程-c#实例教程,适合初学者

    万次阅读 多人点赞 2016-08-22 11:13:24
    本章介绍C#语言的基础知识,希望具有C语言的读者能够基本掌握C#语言,并以此基础,能够进一步学习用C#语言编写window应用程序和Web应用程序。当然仅靠一章的内容就完全掌握C#语言是不可能的,如需进一步学习C#语言...
  • 专栏C++学习笔记 《C++ Primer》学习笔记/习题答案 总目录 ... ——————————————————————————————...《C++ Primer》学习笔记(三):字符串、向量和数组 第三章 字符串、向量和数组 练...
  • 判断字符串为空大全

    千次阅读 2011-07-21 08:17:48
    string.Empty就相当于"" 一般用于字符串的初始化 比如: string a; Console.WriteLine(a);//这里会报错,因为没有初始化a而下面不会报错: string a=string.Empty; Console.WriteLine(a);或者用于比
  • 首先需要说明的是,我所说的字符串的长度,不是string的length,也不是string的size。我指的是显示的长度,即物理长度。缘由: 之所以要提到这个,是因为遇到了一些问题。 再使用duilib进行开发时,发现label控件...
  • C# 字符串比较优化(StringComparison)

    千次阅读 2016-08-12 11:29:54
    因朋友极力推荐,近一年在一家国企上班。忙忙碌碌天天叨叨不停,就是不写代码。现在之前的基础都忘差不多了,不感慨...我们在写程序的时候,经常会用到字符串对比。例如:if(IsCheck =="true") 当大小写敏感的时候一
  • Java 字符串的编码解码

    千次阅读 2017-10-29 16:08:25
    结合别人的内容和自己的理解规范地整理出,做以笔记 一、认识编码 .编码:规定每个“字符”分别用一个...二、Java中常用的字符串的编码解码 1.将字符串转换成byte数组再恢复: byte[] getBytes(String charsetNam
  • WPF开发教程

    万次阅读 多人点赞 2019-07-02 23:13:20
    ------WPF开发教程 目录 WPF基础入门....... 1. WPF基础之体系结构......4. WPF基础之属性系统... 26 5. WPF基础之路由事件... 33 6. WPF基础之布局系统... 46 7. WPF基础之样式设置和模板化... ...
  • Kotlin:数组、字符串模板

    千次阅读 2019-05-20 16:23:07
     Kotlin 中的数组是带有类型参数的类,其元素类型被指定相应的类型参数,使用 Array 类来表示, Array 类定义了 get 与 set 函数(按照运算符重载约定这会转变 [ ] )以及 size 属性等  创建数组的方法有以下几...
  • 属性名和属性值必须以字符串的形式进行传递。如果元素中存在指定的属性,它的值将被刷新;如果不存在,则setAttribute() 方法将元素创建该属性并赋值。 示例1 下面示例分别页面中 div 元素设置 title 属性。 ...
  • TStringList:字符串列表

    千次阅读 2014-06-11 13:33:16
    TStringList:字符串列表  2009-04-13 15:18:53| 分类: delphi | 标签: |举报 |字号大中小 订阅 声明:type TStringList; 描述:TStringList是一个公用的类类型,它对于许多列表处理...
  • Scala实战专栏 (一) ——— 字符串

    千次阅读 2018-09-10 22:33:38
    scala-basic 基础篇 @author 鲁伟林 Scala基础知识介绍,主要包括《Scala编程实战》基础章节 GitHub地址: https://github.com/thinkingfioa/scala-in-action 本人博客地址: ... 第1章 字符串 第...
  • 匹配包含换行符(回车)的任意字符串的正则表达式 正则表达式Java  匹配包含换行符(回车)的任意字符串的正则表达式 1) [\s\S] 2) Pattern.DOTALL \s 匹配字符串的过程中经常会用到能够匹配...
  • html标签属性为布尔

    千次阅读 2018-02-09 09:11:11
    任意字符串">click 要让不可点击的按钮,回到点击状态有两种方式: 通过JS移除disabled属性 通过JS赋值:document.getElementById("Button").disabled = true; 参考资料: 链接1 链接2
  • 字符串资源给应用程序提供带有文本样式和格式选项的文本字符串。能够给应用程序提供三种类型的字符串资源: 1. String 提供单一字符串的XML资源。 2. String Array 提供一个字符串数组的XML资源 3. ...
  • java字符串模糊匹配

    千次阅读 2014-01-11 00:57:20
    今天因为业务需求,需要在java中进行字符串的模糊匹配,由于要比较的对象长度不同,也没有固定的组成规则,收集到下列三个方法解决问题  方法一、  public int indexOf(String str)  返回指定子字符串在此...
  • C++ string 用法详解 /////////////////////////////////////////////...还是有许多人不愿意使用C或者C++,什么?原因众多,其中之一就是C/C++的文本处理功能太麻烦,用起来很不方便。以前没有接触过其他语言时,每当
  • java中字符串的编码解码问题

    千次阅读 2014-03-21 13:22:08
    1.将字符串转换成byte数组再恢复: byte[] getBytes(String charsetName) String(byte[] bytes, String charsetName) 或getBytes() String(byte[] bytes) 2.使用String sun.misc.BASE64Encode.encode...
  • linux grep查找字符串

    千次阅读 2014-11-30 02:09:50
    在当前目录下查找包含 hello 字符串的 后缀名 .c 的文件: find . -name "*.c" | xargs grep -H "hello" 附:(转) 1. Grep简介 Grep (global search regular expression(RE) and print out the ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 94,294
精华内容 37,717
关键字:

下列属性值为字符串的属性是