点击上方蓝字设为星标

每周一、三、五上午 8:30 准时推送

下面开始今天的学习~

数组和字符串

所谓数组,是有序的元素序列。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。用于区分数组的各个元素的数字编号称为下标。字符串,是由零个或多个字符组成的有限序列。通常以串的整体作为操作对象。数组和字符串属于比较简单的数据结构类型,但简单并不意味着轻视。将看似简单的东西做到极致,也能够玩出花来。数组和字符串常见的考点有:字符串翻转、字符串匹配、atoi、数组的增删改查等等。纯数组和字符串的问题往往比较简单,复杂的算法题目会结合指针、双指针,动态规划算法等考察。在对字符串操作的过程中,有时会需要将其转换为字符数组,或者将数组 join 成字符串,非常灵活。以翻转一个字符串为例:一种比较快速和直观的方法是用两个指针,一个指向字符串的第一个字符 a,一个指向它的最后一个字符 m,然后互相交换。交换之后,两个指针向中央一步步地靠拢并相互交换字符,直到两个指针相遇。由于无法直接修改字符串里的字符,所以必须先把字符串变换为数组,然后再运用这个算法。动画演示要掌握一种数据结构,就必须要懂得分析它的优点和缺点。数组的优点

  • 构建一个数组非常简单

  • 能让我们在 O(1) 的时间里根据数组的下标(index)查询某个元素

数组的缺点

  • 构建时必须分配一段连续的空间
  • 查询某个元素是否存在时需要遍历整个数组,耗费 O(n) 的时间(其中,n 是元素的个数)

  • 删除和添加某个元素时,同样需要耗费 O(n) 的时间

动画演示

所以,在考虑是否应当采用数组去辅助所用算法时,务必需要考虑它的优缺点,看看它的缺点是否会阻碍所用算法的复杂度以及空间复杂度。

例题分析

力扣 242. 有效的字母异位词

题目描述

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。示例 1:

输入: s = "anagram", t = "nagaram"输出: true

示例 2:

输入: s = "rat", t = "car"输出: false

说明:

你可以假设字符串只包含小写字母。

进阶:

如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?

解决方案

所谓字母异位词,也就是两个字符串中的相同字符的数量要对应相等。例如:s 等于 “anagram”,t 等于 “nagaram”, s 就是 t 的字母异位词,因为它们都包含有三个字符a,一个字符g,一个字符m,一个字符n以及一个字符r。而当 s 为 “rat”,t 为 “car”的时候,s 就不是 t 的字母异位词。这道题应该怎么分析和处理呢?题目里有一个重要的前提:假设两个字符串只包含小写字母。我们都知道,小写字母一共也就 26 个,这意味着,我们可以利用两个个长度都为 26 的字符数组来统计每个字符串中小写字母出现的次数,然后再对比看看是否相等即可。或者,也可以只利用一个长度为 26 的字符数组,将出现在字符串 s 里的字符个数加一,而出现在字符串 t 里的字符个数减一,最后判断每个小写字母的个数是否都为零就可以了。经过这一系列的操作,我们发现数组中每个字符的个数都为 0,于是得出结论,s 是 t 的字母异位词。动图演示

在这里,我们就不针对代码进行具体地剖析了,这道题是一道非常经典的考题,感兴趣的同学可以到力扣上试试。

力扣 709. 转换成小写字母

题目描述

实现函数 ToLowerCase(),该函数接收一个字符串参数 str,并将该字符串中的大写字母转换成小写字母,之后返回新的字符串。示例 1

输入: "Hello"输出: "hello"

示例 2

输入: "here"输出: "here"

示例 3

输入: "LOVELY"输出: "lovely"

解决方案

如果偷懒的话可以直接使用库函数 toLowerCase:

kotlin  实现

class Solution {    fun toLowerCase(str: String): String {        return str.toLowerCase()    }}

力扣是允许直接使用库函数的,不过既然是做算法题,最好是自己手动实现:kotlin  实现

class Solution {    fun toLowerCase(str: String): String {        val result = StringBuilder()        str.forEach{it ->            if(it in 'A'..'Z'){                result.append(it + 32)            }else{                result.append(it)            }        }        return result.toString()    }}

由于字符在内存中是使用 ASCII 码存储的,小写字母比大写字母大 32,所以思路是:遍历字符串,将大写字母 +32 存储到结果中。如果记不住数字 32 的话,也可以使用 ('a' - 'A')。通过这道简单的热身题,我们大致明白了纯字符串问题的解题思路是转换为字符数组再求解。再来一道中等题目练练手。

力扣 8. 字符串转换整数 (atoi)

题目描述

请你来实现一个 atoi 函数,使其能将字符串转换成整数。

首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。

当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。

该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,它们对于函数不应该造成影响。

注意:假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换。

在任何情况下,若函数不能进行有效的转换时,请返回 0。

说明:

假设我们的环境只能存储  32  位大小的有符号整数,那么其数值范围为 [−2^31,  2^31 − 1]。如果数值超过这个范围,请返回  INT_MAX (2^31 − 1) 或 INT_MIN (−2^31) 。

示例 1

输入: "42"输出: 42

示例 2:

输入: "   -42"输出: -42解释: 第一个非空白字符为 '-', 它是一个负号。     我们尽可能将负号与后面所有连续出现的数字组合起来,最后得到 -42 。

示例 3:

输入: "4193 with words"输出: 4193解释: 转换截止于数字 '3' ,因为它的下一个字符不为数字。

示例 4:

输入: "words and 987"输出: 0解释: 第一个非空字符是 'w', 但它不是数字或正、负号。     因此无法执行有效的转换。

示例 5:

输入: "-91283472332"输出: -2147483648解释: 数字 "-91283472332" 超过 32 位有符号整数范围。     因此返回 INT_MIN(−2^31) 。

解决方案atoi 问题在面试中出现比较频繁,原因主要是它理解起来简单,让面试者不会在题目理解上吃亏,又涵盖了非常多的边界条件。可以考察出面试者考虑问题的全面性和对细节的处理。atoi 根据规则的不同有多个变种,力扣上收录的这道题可谓是非常经典,涵盖了几乎所有可能出现的边界情况。对于 atoi 问题,需要考虑以下三点:

  • 数据范围是否越界,比如超长数字字符串是无法转换为 int 的。

  • 负数和 0 怎么处理

  • 错误输入怎么处理,比如空字符串、非数字型字符等等

这道题的解法如下:

kotlin  实现

class Solution {    fun myAtoi(str: String): Int {        // 起始下标        var index = 0        // 去空格        while (index < str.length && str[index] == ' ') index++        // 是否是负数        var flag = false        if (index < str.length && str[index] == '+') {            index++        } else if (index < str.length && str[index] == '-') {            flag = true            index++        }        var result = 0L        for (i in index until str.length) {            // 不是数字,跳出循环            if (str[i] !in '0'..'9') break            // 后缀此数字            result = result * 10 + (str[i] - '0')            // 是否越界            if (!flag && result > Int.MAX_VALUE) return Int.MAX_VALUE            if (flag && -result < Int.MIN_VALUE) return Int.MIN_VALUE        }        return if (flag) -result.toInt() else result.toInt()    }}

可以看到,我们同样采用了访问数组的形式访问字符串,使用 index 记录当前访问到的位置(相当于对应数组的下标),首先去除字符串的起始空格,然后使用 flag 标志数字的正负属性。继续访问字符串,将数字不断计入结果 result 中。这里使用了两个技巧:

  • 通过字符减去 '0' 将字符转换为数字

  • 通过结果乘以 10 添加新数字后缀

还有一个细节需要注意,result 不能使用 int 存储,因为题目中说到数字可能会越界,所以我们用 Long 型保存结果,并在每次数字更新后判断是否越界,如果越界立即返回。最后根据 flag 返回正数结果或负数结果。

事实上,atoi 真正核心的代码只有一行:

if (str[i] in '0'..'9') {  result = result * 10 + (str[i] - '0')}

其他的代码都是条件判断,但这道中等难度的题目通过率仅有17.3%,在力扣的通过率排行榜中排名倒数前二十,足见其需要的细致程度有多高。

巩固练习

力扣 12. 整数转罗马数字

力扣 1016. 子串能表示从 1 到 N 数字的二进制串

力扣 804. 唯一摩尔斯密码词

力扣 809. 情感丰富的文字

力扣 344. 反转字符串

本文作者:力扣

编辑&版式:霍霍

声明:本文内容和配图归 “力扣” 版权所有,严禁翻版,如需转载请联系。

点个在看,少个 bug?

cmake字符串转数组_掌握常用的数据结构之数组和字符串相关推荐

  1. scala 字符串转换数组_如何在Scala中将字节数组转换为字符串?

    scala 字符串转换数组 Byte Array in Scala is an array of elements of a byte type. String in Scala is a colle ...

  2. 列名必须是一个字符串或者数组_我爱Julia之入门-078(字符串08)

    字符串连接 我们经常会遇到将字符序列或字符串数集通过连接的方式获得新的字符串.我们可以使用 String 的构造函数对字符数组进行连接.但这种方法并不适用于字符元组,也不支持字符串数组. String ...

  3. oracle将字符串转成数组_【算法打卡】上升下降字符串

    小时候的偶像,现在还是 难度:简单 题目: 给你一个字符串 s ,请你根据下面的算法重新构造字符串: 从 s 中选出 最小 的字符,将它 接在 结果字符串的后面. 从 s 剩余字符中选出 最小 的字符 ...

  4. java字符串底层实现_「JAVA」细述合理创建字符串,分析字符串的底层存储,你不该错过...

    Java基础之字符串操作--String 字符串 什么是字符串?如果直接按照字面意思来理解就是多个字符连接起来组合成的字符序列.为了更好的理解以上的理论,我们先来解释下字符序列,字符序列:把多个字符按 ...

  5. python 怎么打印数组_?怎么将python中的数组全部打印出来array

    python array list 1,3似乎不遍历循环是不行滴~ python中的list和array的不同之处 上面正解 python的numpy中合并array 你好: 你用append()是函 ...

  6. doctrine find的对象转换成数组_「ES6基础」Array数组的新方法(上)

    在日常工作中我们经常会与数组打交道,因此需要熟练掌握数组操作的相关方法,ES6中关于数组的操作,又给我们带来了哪些惊喜呢,Array数组操作又添加了哪些新方法? 本篇文章将从以下几个方面进行介绍: A ...

  7. es6一维数组转二维数组_技术图文:Numpy 一维数组 VS. Pandas Series

    背景 Numpy 提供的最重要的数据结构是 ndarray,它是 Python 中 list 的扩展. Pandas 提供了两种非常重要的数据结构 Series和DataFrame. Numpy 中的 ...

  8. map中获取数组_如何从php多维数组中获取特定的键值?

    点击蓝字关注我们!每天获取最新的编程小知识! 源 / php中文网      源 / www.php.cn 在这篇文章中,我们将给大家介绍如何在php中从多维数组中获取特定的键值数组.这里我们将使用a ...

  9. 数据结构动态顺序字符串基本操作实验_技术连载:数据结构 - 栈

    栈 只有一个口,可以进数据也可以出数据,一种典型的先进后出.后进先出的数据结构: 栈 栈的基本操作 入栈 入栈操作需要考虑当前栈是否以及满了,如果满了是选择扩容还是返回入栈失败: 入栈成功则需要更新栈 ...

最新文章

  1. SSH开发环境整合搭建
  2. C语言 字符串和指针
  3. 第九届蓝桥杯java B组—第二题方格计数(详细介绍)
  4. Spring Boot 2.X系列教程:七天从无到有掌握Spring Boot-持续更新
  5. 微信小程序判断服务器返回值,让微信小程序内置函数返回promise的方法
  6. (链表 栈 队列 递归)
  7. 亚马逊出的平板电脑_亚马逊发布Fire HD 8新系列平板电脑,90美元起
  8. WPF 第三方控件学习使用——可停靠布局控件(AvalonDock)
  9. 分支定界法求解旅行商问题
  10. 磁传感器AKM8975驱动和中间层
  11. Android 动画系列二之补间动画
  12. 环境类sci期刊排名一区_计算机类期刊推荐:EI期刊求毕业,SCI大佬止步
  13. Records of Reinfocement Learning Experiments
  14. 手把手教会你安装GitForWindows和TortoiseGit
  15. 去字节面试,直接让人出门左拐:Bean 生命周期都不知道!
  16. 从中国制造到中国智造,打通工业互联网的任督二脉
  17. js实现的在线绘图板,写字板
  18. CSS零基础快速入门(详细教程)
  19. Linux部署Nginx实现反向代理
  20. Gly-Phe-Leu, 15373-56-5

热门文章

  1. 世行报告称气候变暖已给发展中国家造成影响
  2. ios10前台收到推送_IOS - 前台时的推送弹窗效果
  3. 瑞幸被椰树“带坏”了?
  4. 强生CEO加入苹果成为新董事
  5. 首销价1999元起!OPPO K9 Pro开启预售:搭载天玑1200芯片
  6. 再延期!曝华为P50六月发布
  7. 小米宣布造车后,雷军与四位造车界大佬合影照曝光
  8. 荣耀30系列预热视频曝光:前置开孔双摄 侧面看够薄
  9. 罗永浩确认12月初开发布会 不是手机也不是电子烟
  10. 华为苏州人工智能研发基地揭牌 将容纳上万名工作人员