做第13题:13. 罗马数字转整数,本身的逻辑很简单,但是我写了两个小时的笔记。

原因是我对 C++ 11 及以上一直不熟(以前一直在用 python 干活儿),因此,决定,一边做题,一边总结知识点。

我会把我的笔记记录在 CSDN 以及 刷题的 GitHub 上:PiperLiu/ACMOI_Journey 欢迎star

此外,我还精心经营着 高质量的技术公众号:Piper蛋窝 内容包括算法、设计哲学、深度学习、强化学习、有趣的前端、后端基本功等等,强烈建议关注。

这道题目我提取的知识点有:

  • C中的字符串 char a[] 及其方法 string.h
  • C++中的字符串 string 及其方法 std string
  • C++ 与 python 中的映射容器:unordered_map(哈希) map(红黑树) dict

要求

一般来讲, C++ 的版本要在 11 及以上; Python 应至少为 3.6 版本以上。

索引

  • 哈希映射:C++ Python
  • 字符串:C C++

哈希映射

C++哈希映射

以下二者操作相同,但是底层实现不同:

  • unordered_map #include <unordered_map> 基于哈希映射 unordered_map<string, int> m = {{"I", 1}, {"V": 5}}
  • map #include <map> 基于红黑树

unordered_map

// 参考 https://blog.csdn.net/BillCYJ/article/details/78985895
#include <iostream>
#include <unordered_map>
#include <map>
#include <string>
using namespace std;
int main()
{//注意:C++11才开始支持括号初始化unordered_map<int, string> myMap={{ 5, "张大" },{ 6, "李五" }};  //使用{}赋值myMap[2] = "李四";  //使用[ ]进行单个插入,若已存在键值2,则赋值修改,若无则插入。myMap.insert(pair<int, string>(3, "陈二"));//使用insert和pair插入//遍历输出+迭代器的使用auto iter = myMap.begin();  //auto自动识别为迭代器类型unordered_map<int,string>::iteratorwhile (iter != myMap.end()){  cout << iter->first << "," << iter->second << endl;++iter;}  //查找元素并输出+迭代器的使用auto iterator = myMap.find(2);  //find()返回一个指向2的迭代器if (iterator != myMap.end())cout << endl << iterator->first << "," << iterator->second << endl;system("pause");return 0;
}

使用 unordered_map 输出:

3,陈二
2,李四
6,李五
5,张大2,李四

若使用 map 则输出:

2,李四
3,陈二
5,张大
6,李五2,李四

Python哈希映射

dict str2int = {'a': 1, 'b': 2}

  • 不需要定义键与值的泛型
a = {"a": 2}
b = {"b": 3}
c = dict()# 获取
a.keys()  # dict_keys(["a"])# 赋值、插入
a.setdefault("a", 3)  # a = {"a": 2}
b.setdefault("z", 4)  # b = {"b": 3, "z": 4}
a["x"] = 5
a.update({1: 2})  # {'a': 2, 'x': 5, 1: 2}# 删除(键)
a.pop("a")  # {'x': 5, 1: 2}
a.popitem()
print(a)  # {'x': 5}
a.popitem()
print(a)  # {}# 此外还有 clear()

字符串

C字符串

chars

char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
char greeting[] = "Hello";

在标准库 string.h 中存有 6 个常见的方法。

// 参考 https://www.runoob.com/cprogramming/c-strings.html
#include <stdio.h>
#include <string.h>int main ()
{char str1[12] = "Hello";char str2[12] = "World";char str3[12];int  len ;/* 复制 str1 到 str3 */strcpy(str3, str1);printf("strcpy(str3, str1):  %s\n", str3 );/* 连接 str1 和 str2 */strcat(str1, str2);printf("strcat(str1, str2):   %s\n", str1 );/* 连接后,str1 的总长度 */len = strlen(str1);printf("strlen(str1) :  %d\n", len );return 0;
}

输出为:

strcpy(str3, str1):  Hello
strcat(str1, str2):   HelloWorld
strlen(str1) :  10

C++字符串

string #include <string> using namespace std;

  • 可以使用 +, +=
  • 可以直接赋值 string s = "Hello";
  • .size() 返回长度
  • 也可以用 [] 访问索引对应元素 但注意返回的是 char ,而非 string!与 substr() 不同!
  • 此外还有如下方法
// 参考:https://www.runoob.com/cplusplus/cpp-strings.html
// 声明
string s1();  // si = ""
string s2("Hello");  // s2 = "Hello"
string s3(4, 'K');  // s3 = "KKKK"
string s4("12345", 1, 3);  //s4 = "234",即 "12345" 的从下标 1 开始,长度为 3 的子串// 合并
string s1("123"), s2("abc");
s1.append(s2);  // s1 = "123abc"// 比较
string s1("hello"), s2("hello, world");
int n = s1.compare(s2);
n = s1.compare(1, 2, s2, 0, 3);  //比较s1的子串 (1,2) 和s2的子串 (0,3)// 子串
string s1 = "this is ok";
string s2 = s1.substr(2, 4);  // s2 = "is i"
s2 = s1.substr(2);  // s2 = "is is ok"// 交换
string s1("West"), s2("East");
s1.swap(s2);  // s1 = "East",s2 = "West"

下面是一个使用 [] 访问的示例。 但注意返回的是 char ,而非 string!与 substr() 不同!

#include <string>
#include <iostream>
#include <typeinfo>int main(int argc, char const *argv[])
{std::string s = "abc";std::cout << typeid(s).name() << std::endl;std::cout << typeid(s[0]).name() << std::endl;std::cout << typeid(s.substr(0, 1)).name() << std::endl;return 0;
}

输出如下。

NSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
c
NSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE

一道『easy』等级的力扣题,我写了两个小时的笔记...相关推荐

  1. 力扣题458:可怜的小猪

    力扣题458:可怜的小猪 有 buckets 桶液体,其中 正好 有一桶含有毒药,其余装的都是水.它们从外观看起来都一样.为了弄清楚哪只水桶含有毒药,你可以喂一些猪喝,通过观察猪是否会死进行判断.不幸 ...

  2. 滑动窗口算法框架(Java版)秒杀力扣题(76、567、438、3、485)

    一.声明 1.非常感谢东哥(labuladong)分享了**滑动窗口算法框架**: 2.我在理解了东哥的思想后,用Java实现了滑动窗口算法框架,一来方便自己学习,二来方便一些Java小伙伴: 3.再 ...

  3. 力扣题 <爬楼梯> 递归结合表

    题目描述: 假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 示例 1: 输入:n = 2 输出:2 解释:有两种方法可以爬到楼顶 ...

  4. 力扣题【简单级别】1

    2019.9.10 771.宝石与石头 public int numJewelsInStones(String J, String S) {if (J == null || S == null) re ...

  5. 力扣解法汇总2038- 如果相邻两个颜色均相同则删除当前颜色

    目录链接: 力扣编程题-解法汇总_分享+记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms 原题链接:力扣 描 ...

  6. 力扣题库设计循环队列

    题目要求: 设计你的循环队列实现. 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环.它也被称为"环形缓冲器". 循环队列 ...

  7. 力扣题——2.除数与被除数

    下面,我们来看一道力扣题 题目如下: 需求:给定两个整数,被除数和除数(都是正数,且不超过int范围)将两数相除 要求:不使用乘法.除法和%运算符得到商和余数 分析: 在分析这道题之前,我们先来将一个 ...

  8. 20210408:力扣(二分查找法的两种写法以及变体题目)

    二分查找法的两种写法以及变体题目 写在前面 题目 思路与算法 代码实现 写在最后 写在前面 关于二分查找,真的是一个非常实用的查找算法,主要有两种写法,今天在总结时再次碰到,再次整理,方便后续查看复习 ...

  9. 【力扣网练习题】合并两个有序链表

    将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例:输入:1->2->4, 1->3->4 输出:1->1->2-& ...

最新文章

  1. 牛津大佬|计算机科学方向一对一科研项目
  2. java SpringWeb如何实现打印日志
  3. Struts2返回JSON数据的具体应用范…
  4. Epplus:导出Excel
  5. android崩溃无日志,Android 收集Crash日志----UncaughtExceptionHandler
  6. 三维重建:SFM中BA的并行化
  7. 如何用业余时间成为抢手的数据人才?
  8. 本地更新github项目_GitHub开源项目2019-03-29更新精选
  9. 好看的极简网站导航源码自适应静态页
  10. 20180804的Test
  11. mysql重启,全网独家首发!
  12. 暴风影音2009 去广告的方法
  13. ssm三个框架分别用来干什么_SSM三大框架整合详细教程(Spring+SpringMVC+MyBatis)
  14. vue 动态引入组件
  15. 【JS】WPS宏编辑器
  16. 日本汽车业进一步衰退,日本将来或沦为产业穷国
  17. 《进销存 ——“商品查询/新增”》
  18. C++ Builder和托管C++中属性的使用建议
  19. 在windows 中使用cmd查看连接过的WIFI密码
  20. oppo手机的屏幕常亮问题

热门文章

  1. 【SQL】结构化查询语言
  2. 【Oracle】DG中物理备库、快照备库的相互转换
  3. 网络管理与维护作业5
  4. 解决从json文件中获取不到数据的问题
  5. 关于多属性查找问题的sphinx解决方案
  6. 解决Sql中DIstinct与Order By共同使用的冲突问题
  7. maven工程找不到jar包(依赖)的解决方法
  8. 配置nginx 解决404 not found问题
  9. vue-cli项目中单文件组件引入bootstrap.js异常的解决方案
  10. CopyTranslator(复译)-外文辅助阅读翻译解决方案