一道『easy』等级的力扣题,我写了两个小时的笔记...
做第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』等级的力扣题,我写了两个小时的笔记...相关推荐
- 力扣题458:可怜的小猪
力扣题458:可怜的小猪 有 buckets 桶液体,其中 正好 有一桶含有毒药,其余装的都是水.它们从外观看起来都一样.为了弄清楚哪只水桶含有毒药,你可以喂一些猪喝,通过观察猪是否会死进行判断.不幸 ...
- 滑动窗口算法框架(Java版)秒杀力扣题(76、567、438、3、485)
一.声明 1.非常感谢东哥(labuladong)分享了**滑动窗口算法框架**: 2.我在理解了东哥的思想后,用Java实现了滑动窗口算法框架,一来方便自己学习,二来方便一些Java小伙伴: 3.再 ...
- 力扣题 <爬楼梯> 递归结合表
题目描述: 假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 示例 1: 输入:n = 2 输出:2 解释:有两种方法可以爬到楼顶 ...
- 力扣题【简单级别】1
2019.9.10 771.宝石与石头 public int numJewelsInStones(String J, String S) {if (J == null || S == null) re ...
- 力扣解法汇总2038- 如果相邻两个颜色均相同则删除当前颜色
目录链接: 力扣编程题-解法汇总_分享+记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms 原题链接:力扣 描 ...
- 力扣题库设计循环队列
题目要求: 设计你的循环队列实现. 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环.它也被称为"环形缓冲器". 循环队列 ...
- 力扣题——2.除数与被除数
下面,我们来看一道力扣题 题目如下: 需求:给定两个整数,被除数和除数(都是正数,且不超过int范围)将两数相除 要求:不使用乘法.除法和%运算符得到商和余数 分析: 在分析这道题之前,我们先来将一个 ...
- 20210408:力扣(二分查找法的两种写法以及变体题目)
二分查找法的两种写法以及变体题目 写在前面 题目 思路与算法 代码实现 写在最后 写在前面 关于二分查找,真的是一个非常实用的查找算法,主要有两种写法,今天在总结时再次碰到,再次整理,方便后续查看复习 ...
- 【力扣网练习题】合并两个有序链表
将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例:输入:1->2->4, 1->3->4 输出:1->1->2-& ...
最新文章
- 牛津大佬|计算机科学方向一对一科研项目
- java SpringWeb如何实现打印日志
- Struts2返回JSON数据的具体应用范…
- Epplus:导出Excel
- android崩溃无日志,Android 收集Crash日志----UncaughtExceptionHandler
- 三维重建:SFM中BA的并行化
- 如何用业余时间成为抢手的数据人才?
- 本地更新github项目_GitHub开源项目2019-03-29更新精选
- 好看的极简网站导航源码自适应静态页
- 20180804的Test
- mysql重启,全网独家首发!
- 暴风影音2009 去广告的方法
- ssm三个框架分别用来干什么_SSM三大框架整合详细教程(Spring+SpringMVC+MyBatis)
- vue 动态引入组件
- 【JS】WPS宏编辑器
- 日本汽车业进一步衰退,日本将来或沦为产业穷国
- 《进销存 ——“商品查询/新增”》
- C++ Builder和托管C++中属性的使用建议
- 在windows 中使用cmd查看连接过的WIFI密码
- oppo手机的屏幕常亮问题