精华内容
下载资源
问答
  • 并且除了中间的一行,上部分和下部分应该是对称的这是一我们要准备输出的一菱形的模板 ,一共有7行 7列我们设菱形上部分的总行数为rows,当前输出行数为row当row1时候,A只有1,星号字符一共有6,A左右...

    首先应该了解菱形在输出时,每一行的组成有哪些规律,并且除了中间的一行,上部分和下半部分应该是对称的

    这是一个我们要准备输出的一个菱形的模板 ,一共有7行 7列

    我们设菱形上半部分的总行数为rows,当前输出行数为row

    当row1时候,A只有1个,星号字符一共有6个,A左右分别3个;

    当row2时候,A有3个,星号字符一共有4个,A左右分别2个;

    当row==3的时候,A有5个,星号字符一共有2个,A左右分别1个;

    由此可以总结一个规律,在菱形的上半部分,随着row的增加,A的变化依次为 1 ;3 ;5 …

    星号字符因为是关于字符A对称的所有只用考虑左边或者右边,随着row的增加,星号字符的变化依次为 3 ;2 ;1 …

    随着row的增加A的变化趋势应该是一个公差为2,首项为1的等差数列,项数即为row,而星号变化趋势应该总行数rows减去当前行数再加1。

    这里因为菱形下部分也是类似的,A也是一个等差数列,星号字符就是当前目标行数(仅以下半部分为开始)

    下面就是代码实现:

    一:输出一个实心菱形

    运用刚刚所讲的规律:

    def PrintDiamond(n):

    if n & 1 == 0: return 'error'

    row = int((n - 1) / 2) # row为上部分行数

    for i in range(1, row+1): # 上部分规律

    print('*'*(row-i+1)+'A'*(2*i-1)+'*'*(row-i+1))

    print('A'*n) # 打印中间行

    for i in range(1, row+1): # 下部分规律

    print('*'*i+'A'*(n-2*i)+'*'*i)

    return 'OK'

    if __name__ == '__main__':

    n = int(input())

    print(PrintDiamond(n))

    下面是运行结果:

    测试值为n=11

    也可以采用Python center()方法 ,返回一个原字符串居中,并使用空格填充至长度 width 的新字符串。默认填充字符为空格。

    语法:

    str.center(width[, fillchar])

    例如:

    str_a = 'aoligei'

    str_b = str_a.center(10, '-') # 表示定义最终输出的字符串长度为10,不足用-填充。

    print(len(str_a)) # 因为当前字符串长度为7为奇数,减去width之后为3

    # 不能保证均匀填充,最终字符串右边填充的字符的会比左边多1

    print(str_b)

    print(len(str_b))

    '''

    注意当width减去字符串长度的数目为奇数的时候,即是无法满足左右两边填充字符相等

    如果当前需要填充字符串长度为偶数的时候,最终字符串左边填充的字符的会比右边多1

    反之少一

    '''

    运行结果:

    了解了这个函数后,下面可以用这个函数实现输出实心菱形:

    def PrintDiamond(n):

    if n & 1 == 0: # 判断是否为奇数

    return 'error'

    for i in range(1, n+1, 2): # 上部分 ,当i==n的时候center不做任何填充

    # 这里我直接设置步长为2 其实符合上面我们提到的规律,是一个公差为2的等差数列

    print(('A'*i).center(n, '*'))

    for i in range(n-2, 0, -2): # 下部分 步长-2类似

    print(('A'*i).center(n, '*'))

    return 'OK'

    if __name__ == '__main__':

    n = int(input())

    print(PrintDiamond(n))

    下面是运行效果图:

    这里测试输入的n为12和11

    注意使用center方法时候,因为字符串是不支持原地修改的,所以要引入新的空间,这里我是直接做了输出。

    二:

    输出一个空心菱形:

    空心菱形的规律与实心菱形的很像,可以把它想成就是实心菱形,只不过出去首尾两行,每一个行只有两个A字符,并且中间的A其实是被空格符替换了。

    所以说我们可以先打印前半部分星号字符,再打印一个A字符,然后打印空格,打印下一个A,最后打印后半部分星号字符。

    当然首尾行不用打印空格,也不用打印第二个A字符。

    首先我们知道关于打印A的数目是一个等差数列,只不过上部分和下部分首相和公差不一样而已,由此可以知道在上半部分,除去首行,当row=2,3,4,5…的时候 A的数目分别为2row-1 那么我们再减去每一行首尾的A字符 是不是就得到了空格符的数目,所以空格符的数目:2row-1-2=2*row-3

    下半部分同样是可以得到,row=1,2,3,4…的时候,空格符的数目为9-2*row ,与上半部分不同的是,这里我们不用去掉下部分的首行,而应该去掉尾行,所以说这里row可以等于1.

    下面是代码实现:

    # 星号字符的规律与实心菱形一样11

    def PrintDiamond(n):

    if n & 1 == 0: return 'error'

    row = int((n - 1) / 2)

    for i in range(1, row + 1): # 上部分

    if i == 1: # 应该排除首行

    print('*' * (row - i + 1) + 'A' + '*' * (row - i + 1))

    else:

    print('*' * (row - i + 1) + 'A' + ' ' * (2 * i - 3)

    + 'A' + '*' * (row - i + 1))

    print('A' + ' ' * (n - 2) + 'A') # 中间行

    for i in range(1, row + 1): # 下部分

    if i == row: # 应该排除尾行

    print('*' * i + 'A' + '*' * i)

    continue

    print('*' * i + 'A' + ' ' * (9 - 2 * i) + 'A' + '*' * i)

    return 'OK'

    if __name__ == '__main__':

    n = int(input())

    print(PrintDiamond(n))

    空心菱形则无法用center方法实现。

    这里只是用最简单的数学规律来分析,有更优解这里不做讨论。

    纯数学规律计算,代码健壮性可能不足,欢迎指出。

    展开全文
  • 说实话,Java “每半年发布一新版本”的节奏确实快了点。但不管怎样,新技术、新特性还是值得我们学一学。在 Java 13 中,有了文本块,我们可以轻松地使用多行字符串。我们不再需要对字符串中的特殊字符进行转义,...

    你继续半年一更,我继续用 Java 7/8。

    这可能是很多朋友目前的真实情况。说实话,Java “每半年发布一个新版本”的节奏确实快了点。但不管怎样,新技术、新特性还是值得我们学一学。

    在 Java 13 中,有了文本块,我们可以轻松地使用多行字符串。我们不再需要对字符串中的特殊字符进行转义,也不必对跨越多行的字符串使用 + 串联运算符,它极大地提高代码的可读性。在这篇文章中,我将介绍关于 Java 13 文本块的功能以及使用场景,一起来看看吧。

    什么是文本块?

    String 数据类型可能是 Java 开发人员最常用的类型之一。它可以以任何语言存储从几个字符到多行的所有内容。不过,这种灵活性也导致某些 String 值难以阅读或修改。例如,那些带有引号,转义字符或跨越多行的字符串。

    文本块是 Java 13 的一项预览功能,我们可以使用文本块轻松定义多行字符串而无须添加串联运算符和转义字符。此外,我们还可以控制如何格式化字符串值。

    让我们看看以下 HTML 代码段:

    String html = """      

    "

    Java 13 is here!" """;

    注意,三个双引号 """ 分别定义了块的开始和结尾。看一下在 Java 13 以前是如何定义的:

    String html =   "\n\t\n\t\t

    \"Java 13 is here!\"

    \n\t\n\n";

    或者,更加典型的是:

    String html = "" +"\n\t" + "" +"\n\t\t" + "

    \"Java 13 is here!\"

    " +"\n\t" + "" +"\n" + "";

    上面的这两种写法,在可读性上远远不如不如文本块。

    文本块语法

    就像前面提到的,Java 13 使用三个双引号 """ 作为开始和结束定界符来定义文本块。开始定界符后面可以跟零个或者多个空格一个行终止符结束符没有类似的规则

    这样的语法规则,导致以下示例其实是无效的文本块因为它们在开头定界符之后并没有包含一个行终止符

    String multilineValue1 = """ """;String multilineValue2 = """""";

    这只是预览特性

    文本块在 Java 13 中作为预览特性发布,但预览特性并不意味着它是不完整或半生不熟的功能。从本质上讲,这意味着即使开发人员可以使用此功能,它也可能在将来的 Java 版本中更改。

    这其实是有原因的。通过“每六个月发布一个新版本”的节奏,开发人员可以很快使用到新的语言功能。但是,在向 Java 永久添加语言功能之前,Java 团队会评估开发人员对此的评价。根据反馈的不同,可以在将预览功能添加到 Java SE 之前对其进行完善,也可以将其完全删除。

    要体验预览语言功能,我们需要使用编译和运行时手动启用它们。这样可以确保我们不会意外使用预览功能。要使用文本块编译源文件,请使用 --enable-preview 和 -release 13 选项。以下示例演示了如何使用命令行来编译源文件,例如对于 Java13.java 文件:

    javac --enable-preview --release 13 Java13.java

    为了加强预览功能可能会发生的变化,当我们执行前面的命令时,将会得到如下所示的编译器警告。

    Note: Java13.java uses preview language features.Note: Recompile with Xlint:preview for details.

    要执行类 Java13,我们需要使用 --enable-preview 选项:

    java --enable-preview Java13

    接下来,我们来看一下文本块的实现。

    依然是字符串数据类型

    传统的字符串和文本块都被编译为相同的类型:String。字节码类文件无法区分字符串值是从传统字符串还是文本块派生而来。这意味着文本块值存储在字符串池中。

    考虑以下代码,你觉得变量 traditonalString 和 textBlockString 引用相同的 String 实例吗?

    String traditionalString = "Java";String textBlockString = """Java""";System.out.println(traditionalString == textBlockString);

    答案是肯定的,因为它们的内容是完全相同的,所以上面的代码将会输出 true

    在文章的开头,我讨论了使用传统的 String 处理多行字符串的繁琐,接下来,我们就来看看文本块在 Java 13 中如何提供便利?

    轻松处理多行值

    定义 JSON

    开发人员经常使用多行字符串值,例如 JSON,HTML,XML 或正则表达式(regex)数据。通过文本块,使用多行 JSON 值的方法变得很简单。

    String json = """    {      "name": "web",      "version": "1.0.0",      "dependencies": "AppA"    }""";

    没有了转义字符和连接运算符,代码在视觉上显得很直观,因此,我们可以轻松编辑修改 JSON 值。不信?对比一下使用传统的 String 来定义 JSON 值:

    String json =     "{" +      "\"name\": \"web\"," +      "\"version\": \"1.0.0\"," +      "\"dependencies\": \"AppA\" +     "}";

    定义 SQL

    有时候,我们需要将 SQL 查询语句存储为字符串。假如我们使用 String 变量存储了一个多行 SQL 查询语句,如下所示(对于 Java 12 或更早版本):

    String query =   "SELECT name, age" +  "FROM EMP" +   "WHERE name = \'John\' +  "AND age > 20";

    是不是觉得好像没毛病?其实是有问题的,它是一个无效的 SQL 查询语句。由于每行末尾都少了空格,这个查询语句会被解释为以下内容:

    SELECT name, ageFROM EMPWHERE name = 'John'AND age > 20

    要是使用文本块,就可以避免出现类似问题:

    String query = """  SELECT name, age  FROM EMP  WHERE name = 'John'    AND age > 20  """;

    定义正则表达式

    正则表达式通常会包含许多特殊字符。在 Java 13 之前,我们将一个正则表达式写为 String 时,常常需要转义一些特殊字符,这使得我们难以编写、阅读或理解这些表达式。

    这是一个在文本块之前存储正则表达式 [0-9]{3}\-[0-9]{4} 的示例:

    String java12OrBeforeRegex = "[0-9]{3}\\t-[0-9]{4}";

    有了文本块,我们可以定义出相同的正则表达式,如下所示:

    String java13Regex = """[0-9]{3}\t-[0-9]{4}""";

    文本块中的转义字符

    我们可以将各种转义字符添加到文本块,就像将它们添加到 String 中一样。例如,可以通过将值放在多行上或使用转义字符(例如 \n)来在文本块中包含换行符。在以下代码中,I'm 和 happy 将会分别在两个行上。

    String html = """      

    I'm \nhappy

    """;

    空格与缩进如何处理?

    一个关键问题是如何处理文本块中附带的空白符。事实上,它由编译器很好地处理。在文本块中,任何行上最左边的非空白字符最左边的分隔符定义了字符串开始的位置。

    在下图中,我们可以看到 getHTML() 方法返回了一个 String 类型的值,String 值的最左非空白字符以 < ( 中的 <)开头,该字符与结束定界符对齐

    306777693addf42052abdfd010837937.png

    上面图中的这段代码,其实返回了下图所示的字符串(第一行  和最后一行  都不包含任何前导空格):

    f668d4a0a99d21b7e1db208340fab3eb.png

    若要将字符串开头的空白字符标记为必需的(即:保留  左侧的空白符),我们需要向左移动分隔符或者任何非空白字符。

    比如,我们将闭合定界符 """ 向左移动 8 个空格:

    5dce9d41e219722192fb6609a4589954.png

    修改后的代码将会返回下图所示的 String 值,可以看到每行都添加了 8 个前导空格,外加用户额外缩进的空格。

    d81f858165850d4bc809e6d6a2fe4b9a.png

    默认情况下,文本块会删除每行末尾的空格。如果需要添加它们,可以使用八进制转义字符 \040(在 ASCII 中,空格为 32)来强制包含它们。

    以下是一个示例,该示例在文本块第二行的末尾添加了一个空格:

    String campaign = """            Don't leave home without -            money &\040            carry bag.            Reduce | Reuse            """;

    注意,如果基本空格包含制表符 \t,则不会将其扩展,而是算作单个空格。

    串联文本块

    文本块可以与传统的字符串值通过 + 连接,以下是一个例子:

    String concatenate() {    return """            Items to avoid -            Single            Use            Plastics            """             +             "Let's pledge to find alternatives";}

    之所以提供这种方式,是因为我们有时候需要在字符串中插入变量的值:

    String concatenate(Object obj) {    return """            Items to avoid -            Single            Use            """            + obj + """            Let's pledge to find             alternatives""";}

    文本块可以当作字符串来使用,好处就是我们可以在文本块中使用 String 的方法。例如,我们可以使用 String.replace() 方法而无需做任何特殊处理:

    String concatenateReplace(Object obj) {    return """        Items to avoid -        Single        Use        $type        Let's pledge to find        alternatives""".replace("$type", obj.toString());}

    同样,我们可以使用 format() 方法或者 String 的任何其他方法。

    总结

    关于 Java 13 文本块的说明,这篇文章已经足够详细。文本块可以帮助我们开发人员轻松处理多行字符串值。需要记住,文本块目前只是一个预览功能,它随时可能更改。但即使以当前文本块的这种能力,它也必定会为我们节省很多的编码工作。

    5f0af043cfc645501afe278795e8108d.gif

    展开全文
  • 各位学习C语言的小伙伴们辛苦了!我的“C语言解惑课堂”圈子内容近半个月更新如下: 一、C语言IO解惑内容更新 ...【第170篇】【C语言IO】【scanf函数如何读取两个字符串?】 【第171篇】【C语言IO】【小心scanf...

    各位学习C语言的小伙伴们辛苦了!我的“C语言解惑课堂”圈子内容近半个月更新如下:

    一、C语言IO解惑内容更新

    【第168篇】【C语言IO】【scanf函数读取整数时会留下空格符在缓冲区吗?】
    【第169篇】【C语言IO】【scanf函数读取两个字符时会读取中间用于分隔的空格符吗?】
    【第170篇】【C语言IO】【scanf函数如何读取两个字符串?】
    【第171篇】【C语言IO】【小心scanf函数读取缓冲区的换行符】
    【第172篇】【C语言IO】【scanf函数如何读取一个文件的一行记录的第三个字符串?】
    【第173篇】【C语言IO】【scanf函数读取一个整数,但是输入时先输入空格再输入整数会如何?】
    【第174篇】【C语言IO】【scanf函数读取一个整数,但是输入整数并且紧随着字符串会如何?】
    【第175篇】【C语言IO】【scanf函数读取一个字符串,实际输入两个字符串时会如何?】

     

    二、C语言数组解惑内容更新

    【第176篇】【C语言数组】【如何避免数组元素被更改?】
    【第177篇】【C语言数组】【声明数组时如果没有初始化会如何?】
    【第178篇】【C语言数组】【声明数组时只初始化部分元素,剩下的元素是什么值?】
    【第179篇】【C语言数组】【声明数组时多初始化一个元素会如何?】
    【第180篇】【C语言数组】【sizeof(数组名)和sizeof(指针名)有什么区别?】
    【第181篇】【C语言数组】【两个数组名之间可以直接画等号赋值吗?】
    【第182篇】【C语言数组】【声明数组时没初始化后面可以再花括号初始化吗?】
    【第183篇】【C语言数组】【const、指针、数组的三个用法区别1】
    【第184篇】【C语言数组】【const、指针、数组的三个用法区别2】
    【第185篇】【C语言数组】【const、指针、数组的三个用法区别3】
    【第186篇】【C语言数组】【二维数组名作为函数的形参时,第二个下标可以为空吗?】
    【第187篇】【C语言数组】【声明二位数组时只初始化部分元素,剩下的元素是什么值?】

     

    三、问答互动内容更新

    1、老师,我写了一个程序,代码是这个
    2、星主,请教下,在自然数1-500以内找出所有这样数
    3、我想问下,我用scanf函数读取字符串时,遇到空格就不读了吗?如何能够跳过空格呢?
    4、如何提取一个字符串中的所有数字?并且组成一个数字?我写了一个函数,但是没有思路,麻烦看下
    5、我要在一个主字符串中找出一个子串出现的次数,该怎么找呀?有没有一个思路?
    6、老師,如何去除字符串中的所有非数字字符,并且把所有数字字符按照先后顺序组成一个数字?我寫了如下代碼,不知道哪裏錯了。
    7、星主,我有个问题,有一个字符数组,用户输入一个字符串给这个字符数组,要求把字符数组中的所有无效字符去除,有效字符留下,并且统计出所有的有效字符的个数。
    8、请问,如何获得一个文件指定行指定字符串后的数值?
    9、请问:这道题我写的程序0.11111#和0.1111111#都运行正确,但是0.111111就不行。问题出在哪呢?
    10、你好,请问我这个程序哪里错了?我输入两门课程的成绩99和99,为什么会输出"努力"?
    11、老师您好。看了你的第171篇的文章后我懂了,缓冲区中会留下一个换行符,但是我怎么让第二个scanf函数不去读这个换行符呢?

    四、C语言试题解析内容更新

    【第155篇】【试题解析】用C语言的数组实现了学生信息管理系统
    【第159篇】【试题解析】【学生信息管理系统数组版】“main”函数的代码和运行图
    【第160篇】【试题解析】【学生信息管理系统数组版】"Common"文件代码
    【第161篇】【试题解析】【学生信息管理系统数组版】"Stu.h"文件代码
    【第162篇】【试题解析】【学生信息管理系统数组版】"Initial"文件代码
    【第163篇】【试题解析】【学生信息管理系统数组版】添加学生信息文件代码
    【第164篇】【试题解析】【学生信息管理系统数组版】删除学生信息文件代码
    【第165篇】【试题解析】【学生信息管理系统数组版】修改学生信息文件代码
    【第166篇】【试题解析】【学生信息管理系统数组版】显示学生信息文件代码
    【第167篇】【试题解析】【学生信息管理系统数组版】文件代码和运行结果

     

    五、查看方式

    在我的微信公众号“C语言编程技术分享”主页回复“20191109”可进入学习!

     

    展开全文
  • 刷过算法题汇总

    2014-04-05 20:52:00
    字符处理类: (1) 题目描述: 请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。 输入: 每个输入文件仅包含一组测试样例。对于每组...

    按照类型分类一下,方便自己的总结和回忆,暂时不知道如何分类,所以先随意列个框架,这半年去慢慢完善好。

     

    字符处理类:

    (1)

    题目描述:

    请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。

    输入:

    每个输入文件仅包含一组测试样例。
    对于每组测试案例,输入一行代表要处理的字符串。

    输出:

    对应每个测试案例,出经过处理后的字符串。

    样例输入:
    We Are Happy
    样例输出:
    We%20Are%20Happy
     
    这一题来自剑指offer,测试用例包括完全是空的字符串能否读入,实际编程中发现有些方式纯粹空字符串无法读取。在编程过程中出现了以下两个问题:
    (1)完全有空格组成的字符串无法读取,Java中的Scanner.nextLine()无法读取一个完全由空格组成的字符串,改为由InputStreamReader方式读取才可以;
    (2)Java本身的效率问题,超时,无法使用String的自带方法String.replaceAll(“ ”,"%20”)。
    (3)替换过程中,从尾部开始替换,一次性替换到位,这样可以保持O(n)的复杂度。
    #include<string.h>
    #include<stdio.h>
     
    int main() {
        int i,count,len;
        int pos,newpos,hold;
        char str[1000000];
        memset(str,1000000,'\0');
        while (gets(str)!=NULL) {
            len = 0;
            count = 0;
            
            for(i=0;i<1000000 && str[i]!='\0';i++){
                if(str[i]==' '){
                    count++;
                }
                len = i;
            }
            pos = len;
            newpos = len+count*2;
            hold = newpos;
            
            str[newpos+1]='\0';
            for(pos;pos>=0;pos--){
                if(str[pos]==' '){
                    str[newpos-2] = '%';
                    str[newpos-1] = '2';
                    str[newpos] = '0';
                    newpos-=3;
                }
                else{
                    str[newpos--] = str[pos];
                }
            }
            
            printf("%s\n",str);
            memset(str,1000000,'\0');
        }
        return 0;
    }
     

    链表类:

    (1)

    题目描述:

    输入一个链表,从尾到头打印链表每个节点的值。

    输入:

    每个输入文件仅包含一组测试样例。
    每一组测试案例包含多行,每行一个大于0的整数,代表一个链表的节点。第一行是链表第一个节点的值,依次类推。当输入到-1时代表链表输入完毕。-1本身不属于链表。

    输出:

    对应每个测试案例,以从尾到头的顺序输出链表每个节点的值,每个值占一行。

     

    使用STL里面的stack,别傻傻的自己写stack啦

    #include<stdio.h>
    #include<stack>
    using namespace std;
     
    int main(){
        int num = 0;
        int i;
        stack<int> s;
        
        scanf("%d",&num);
        while(num!=-1){
            s.push(num);
            scanf("%d",&num);
        }
     
        while(!s.empty()){
            printf("%d\n",s.top());
            s.pop();
        }
     
        return 0;
    }

     

     

     

    树类:

    Given a binary tree, return the postorder traversal of its nodes' values.

    For example:
    Given binary tree {1,#,2,3},

       1
        \
         2
        /
       3
    

    return [3,2,1].

    Note: Recursive solution is trivial, could you do it iteratively?

     

    #include "main.h"
    #include<iostream>   
    #include<stdio.h>
    #include<stdlib.h>
    #include <vector> 
    using namespace std;
     
    /**
     * Definition for binary tree
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
      struct TreeNode {
          int val;
          TreeNode *left;
          TreeNode *right;
          TreeNode(int x) : val(x), left(NULL), right(NULL) {}
      };
     
    class Solution {
    public:
       public:
        vector<int> postorderTraversal(TreeNode *root) {
            vector<int> arr;
            arr = postorderTrave(root,arr);
            return arr;
        }
        
        vector<int> postorderTrave(TreeNode *root, vector<int> arr){
            if(root!=NULL){
                if(root->left!=NULL){
                
                    arr = postorderTrave(root->left,arr);
                }
                if(root->right!=NULL){
                    arr = postorderTrave(root->right,arr);
                }
                    arr.push_back(root->val);
            }
            return arr;
        }
        
        
        
    };
     
    int main(){
     
        TreeNode head = TreeNode(1);
        TreeNode cl = TreeNode(2);
        TreeNode cr = TreeNode(3);
        head.left = &cl;
        head.right = &cr;
        
        vector<int> arr ;
        
        
        Solution s ;
        arr = s.postorderTraversal(&head);
     
        for(int i=0;i<arr.size();i++){
            cout<<arr[i]<<endl;
        }
        
        return 0;
    }

     

    Given a binary tree containing digits from 0-9 only, each root-to-leaf path could represent a number.

    An example is the root-to-leaf path 1->2->3 which represents the number 123.

    Find the total sum of all root-to-leaf numbers.

    For example,

        1
       / \
      2   3
    

    The root-to-leaf path 1->2 represents the number 12.
    The root-to-leaf path 1->3 represents the number 13.

    Return the sum = 12 + 13 = 25.

     

    本题需要找到所有的路径(从根节点到叶节点)。这里采用的办法遍历过程中使用一个数组来保存当前操作节点到根节点之间的序列,当确定一个点为叶子节点之后,通过路径数组来获得该条路径所对应的数,遍历一遍之后,得到sum值

    #include "main.h"
    #include<iostream>   
    #include<stdio.h>
    #include<stdlib.h>
    #include <vector> 
    using namespace std;
     
    /**
     * Definition for binary tree
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
      struct TreeNode {
          int val;
          TreeNode *left;
          TreeNode *right;
          TreeNode(int x) : val(x), left(NULL), right(NULL) {}
      };
     
    class Solution {
        
    public:
       public:
        vector<int> postorderTraversal(TreeNode *root) {
            vector<int> arr;
            arr = postorderTrave(root,arr);
            return arr;
        }
        vector<int> postorderTrave(TreeNode *root, vector<int> arr){
            if(root!=NULL){
                if(root->left!=NULL){
                
                    arr = postorderTrave(root->left,arr);
                }
                if(root->right!=NULL){
                    arr = postorderTrave(root->right,arr);
                }
                    arr.push_back(root->val);
            }
            return arr;
        }
        
        vector<int> preorderTraversal(TreeNode *root) {
            vector<int> arr;
            arr = preorderTrave(root,arr);
            return arr;
        }
        vector<int> preorderTrave(TreeNode *root, vector<int> arr){
            if(root!=NULL){
                arr.push_back(root->val);
                if(root->left!=NULL){
                
                    arr = postorderTrave(root->left,arr);
                }
                if(root->right!=NULL){
                    arr = postorderTrave(root->right,arr);
                }    
            }
            return arr;
        }
        
        int sumNumbers(TreeNode *root) {
            vector<int> path;
            int sum = 0;
            getSum(root, path, sum);
            return sum;
        }
        void getSum(TreeNode *root, vector<int> path, int &sum){
            if(root!=NULL){
                path.push_back(root->val);
                if(root->left!=NULL){
                    getSum(root->left,path,sum);
                }
                if(root->right!=NULL){
                    getSum(root->right,path,sum);
                }
                if(root->left==NULL && root->right==NULL){
                        int num=0;
                        int temp =1;
                        for(int i=0;i<path.size();i++){
                            num = num + path[path.size()-1-i]*temp;
                            temp *= 10;
                        }
                        sum += num;
                }
                path.pop_back();
            }
        }
    };
     
    int main(){
     
        TreeNode head = TreeNode(1);
        TreeNode cl = TreeNode(2);
        TreeNode cr = TreeNode(3);
        head.left = &cl;
        head.right = &cr;
        
        vector<int> arr ;
        
        
        Solution s ;
        int num = s.sumNumbers(&head);
        cout<<num<<endl;
        arr = s.postorderTraversal(&head);
     
    //    for(int i=0;i<arr.size();i++){
    //        cout<<arr[i]<<endl;
    //    }
        
        return 0;
    }

     

     

    位操作:

    Single Number II
    Total Accepted: 14014 Total Submissions: 42933My Submissions

    Given an array of integers, every element appears three times except for one. Find that single one.

    Note:
    Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?

     

    算法思想,与一队两个数只有一个重复基本一致。使用位运算,int数据有32位,外层循环分别统计这32个二进制值,而内层循环则统计这一队数据中1的个数,然后%3之后,剩余的余数要么为1,要么为0,即为那唯一的一个数字。

    本题其实,并没有说明不是只有3个的数字具体是多少个,可能有3n+1,3n+2个,这个可以根据n进行判断

    #include <cstdlib>
    #include <iostream>
    #include <stdlib.h>
     
    using namespace std;
     
    class Solution {
    public:
        int singleNumber(int A[], int n) {
            int count;
            int result = 0;
            for(int i=0;i<32;i++){
                    count = 0;
                    for(int j=0;j<n;j++) {
                         if(((A[j]>>i) & 1 )==1){
                              count++;             
                         }          
                    }       
                    count = count%3;
                    result = result | (count<<i); 
            }
            return result;
        }
    };

    转载于:https://www.cnblogs.com/weilf/p/3647544.html

    展开全文
  • 输入数字或字母间隙变大

    千次阅读 2019-02-22 16:20:43
    在我们输入数字或字母时可能会出现如图所示情况,可使用 Shift+空格键 切换回,如果未解决,请找到你的输入法,看看上面有没有圆形的图案,如果有的话,点击圆形图案改成月型图案,把全角模式(一个字符占用两个...
  • 如果分割后最后一个字节为半个汉字,该字节转入下一个文件,以保证不会因为半个汉字而出现乱码。英文分割到单词结尾。OCR功能提示:1、仅能 OCR 单色 TIFF 文件,其它格式请先用ComicEnhancer Pro转成单色 ...
  • php部分常见问题总结

    2021-01-20 00:30:09
    目录: 1:为什么我得不到变量 2:调试你的程序 3:如何使用session 4:为什么我向另一网页传送变量时,只得到前部分,以空格开头的则全部丢失 5:如何截取指定长度汉字而不会出现以”?>”结尾,超出部分以”…”代替...
  • delphi 开发经验技巧宝典源码

    热门讨论 2010-08-12 16:47:23
    0092 使用Copy函数获取一个字符串的子串 64 0093 使用LeftStr函数从左边取得指定个数的字符串 65 0094 使用RightStr函数从右边取得指定个数的字符串 65 0095 使用Length函数取得一段字符串的长度 65 0096 ...
  • C#编程经验技巧宝典

    热门讨论 2008-06-01 08:59:33
    72 <br>0103 如何进行字节数组和字符串的相互转换 72 <br>0104 如何把一个按空格分割的字符串存储在一个ArrayList数组中 73 <br>4.2 获取字符串信息 73 <br>0105 如何获得一个字符串的长度 ...
  • 面试题35:第一只出现一次的字符:先遍历一遍字符串,用一hash表存放每出现的字符字符出现的次数。再遍历一遍字符串,找到hash值等于1的输出即可。 面试题36:数组中的逆序对:这道题可以这么想,我们要找到...
  • JAVA 正则表达式

    热门讨论 2010-01-15 11:16:37
    个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。 自从 jdk1.4 推出 java.util.regex 包,就为我们提供了很好的 JAVA 正则表达式应用平台。 因为正则表达式是一个很庞杂的体系,...
  • 实例201 将两实型数据转换为字符串并连接 实例202 分解字符串中的单词 实例203 不使用库函数复制字符串 第5章 类和对象 5.1 类与对象的使用 实例204 自定义图书类 实例205 温度单位转换工具 实例206 编写...
  • 实例201 将两实型数据转换为字符串并连接 实例202 分解字符串中的单词 实例203 不使用库函数复制字符串 第5章 类和对象 5.1 类与对象的使用 实例204 自定义图书类 实例205 温度单位转换工具 实例206 编写...
  • 最新Java面试宝典pdf版

    热门讨论 2011-08-31 11:29:22
    3、编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串,但要保证汉字不被截取半个,如“我ABC”,4,应该截取“我AB”,输入“我ABC汉DEF”,6,应该输出“我ABC”,而不是“我ABC+汉...
  • Java面试宝典2010版

    2011-06-27 09:48:27
    3、编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串,但要保证汉字不被截取半个,如“我ABC”,4,应该截取“我AB”,输入“我ABC汉DEF”,6,应该输出“我ABC”,而不是“我ABC+汉...
  • 3、编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串,但要保证汉字不被截取半个,如“我ABC”,4,应该截取“我AB”,输入“我ABC汉DEF”,6,应该输出“我ABC”,而不是“我ABC+汉...
  • 实例136 过滤字符串中的空格与NULL值 实例137 获得汉字的拼音简码 5.2 数据验证 实例138 判断字符串是否以指定字符开头 实例139 检查字符串是否包含英文字母 实例140 检查字符串是否包含数字 实例141 判断...
  • 由于只能用在某些sql语句上,具体是哪一个字符串就无足轻重了。第一次在本地环境测试安全狗就绕过了,刚好那天看到论坛在征集优秀文章,计划着写处女作投稿。 附上地址,虽然字符串数量不多,但是确实很淘气... ...
  • 实例041 将字符串的每个字符进行颠倒输出 实例042 去掉字符串中的所有空格 实例043 从字符串中分离文件路径、文件名及扩展名 实例044 获取字符串中汉字的个数 实例045 批量替换某一类字符串 实例046 对字符串...
  • 实例041 将字符串的每个字符进行颠倒输出 实例042 去掉字符串中的所有空格 实例043 从字符串中分离文件路径、文件名及扩展名 实例044 获取字符串中汉字的个数 实例045 批量替换某一类字符串 实例046 对字符串...
  • 实例041 将字符串的每个字符进行颠倒输出 实例042 去掉字符串中的所有空格 实例043 从字符串中分离文件路径、文件名及扩展名 实例044 获取字符串中汉字的个数 实例045 批量替换某一类字符串 实例046 对字符串...
  •  实例041 将字符串的每个字符进行颠倒输出 52  实例042 去掉字符串中的所有空格 54  实例043 从字符串中分离文件路径、文件名及扩展名 55  实例044 获取字符串中汉字的个数 57  实例045 批量替换某一类字符...
  • 实例041 将字符串的每个字符进行颠倒输出 52 实例042 去掉字符串中的所有空格 54 实例043 从字符串中分离文件路径、文件名及 扩展名 55 实例044 获取字符串中汉字的个数 57 实例045 批量替换某一类字符串 58 实例046...
  • 6.8.2 从字符串中删除空格 268 6.8.3 计算表达式的值 268 6.8.4 获得项值 270 6.8.5 分析数 271 6.8.6 整合程序 274 6.8.7 扩展程序 275 6.8.8 提取子字符串 277 6.8.9 运行修改过的程序 279 6.9 C++/CLI...
  • 6.8.2 从字符串中删除空格 268 6.8.3 计算表达式的值 268 6.8.4 获得项值 270 6.8.5 分析数 271 6.8.6 整合程序 274 6.8.7 扩展程序 275 6.8.8 提取子字符串 277 6.8.9 运行修改过的程序 279 6.9 C++/CLI...
  • Visual C++ 2008入门经典--详细书签版

    热门讨论 2013-02-02 16:07:15
    6.7.2 从字符串中删除空格 260 6.7.3 计算表达式的值 261 6.7.4 获得项值 263 6.7.5 分析数 264 6.7.6 整合程序 266 6.7.7 扩展程序 268 6.7.8 提取子字符串 269 6.7.9 运行修改过的程序 271 6.8 C++/CLI...
  • 6.7.2 从字符串中删除空格 260 6.7.3 计算表达式的值 261 6.7.4 获得项值 263 6.7.5 分析数 264 6.7.6 整合程序 266 6.7.7 扩展程序 268 6.7.8 提取子字符串 269 6.7.9 运行修改过的程序 271 6.8 C++/CLI...
  • Java 面试宝典

    2013-02-01 10:02:08
    35、如何把一段逗号分割的字符串转换成一数组? ............................................... 25 36、数组有没有 length()这方法? String 有没有 length()这方法? .................... 25 37、下面这...
  • 14.1 清除字符串中的空格 213 14.1.1 过程式解决方案#1 213 14.1.2 函数解决方案#1 214 14.1.3 函数解决方案#2 217 14.2 聚合函数PRD() 218 14.3 在过程和函数中使用长参数列表 220 第15章 对行编号 ...
  • 实例026 透明渐显窗体 33 实例027 窗口颜色的渐变 34 实例028 带背景的窗体 35 实例029 为窗体增加边框 36 1.9 窗体动画 37 实例030 窗体中的滚动字幕 37 实例031 动画显示窗体 38 实例032 制作...

空空如也

空空如也

1 2
收藏数 38
精华内容 15
关键字:

如何空格半个字符