名人说:莫道桑榆晚,为霞尚满天。——刘禹锡(刘梦得,诗豪)
创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊)目录
- 0、关于核心代码模式该怎么刷题?
- 1、数组中重复的数字
- ①代码实现(带注释)
- ②补充说明(unordered_set)
- 2、替换空格
- ①代码实现(带注释)
- 3、从尾到头打印链表
- ①代码实现(带注释)
- ②补充说明(vector)
0、关于核心代码模式该怎么刷题?
使用核心代码模式,不需要你直接编写main
函数。一般题目设计者或测试平台已经为你写好了main
函数或相应的测试框架。你需要做的是实现指定的功能函数(例如下面例子中是duplicate函数),按照题目要求返回正确的结果即可。测试平台会调用你实现的函数并传递测试用例作为参数,然后根据你的函数返回结果来评判你的代码是否正确。
省流:只需要实现对应题目要求的功能函数(需考虑数据结构和算法设计方面的使用),返回正确结果即可。
1、数组中重复的数字
原题链接:03.数组中重复的数字
①代码实现(带注释)
//Code_流苏(CSDN)
#include <unordered_set> // 引入unordered_set容器,基于哈希表实现
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param numbers int整型vector
* @return int整型
*/
//核心代码如下:
int duplicate(vector<int>& numbers) {
//创建一个unordered_set用于存储已经遍历过的数字
unordered_set<int> seen;
//遍历所输入的数组
for (int num : numbers) {
//如果当前数字已经在seen集合中,表示找到了重复的数字。
if(seen.find(num)!=seen.end()){
//找到了,那么根据题目的要求返回数字即可
return num;
}
//若没找到,将其加入到seen集合里
seen.insert(num);
}
//若经过上面的for循环遍历没有找到重复的数字,按题目要求输出-1
return -1;
}
};
②补充说明(unordered_set)
unordered_set是C++标准库中的一个容器,它基于哈希表实现。它可以存储唯一的元素(即不允许有重复的元素),并且提供了高效的元素查找、插入和删除操作。unordered_set
的优点:
- 快速查找:可以在常数时间内查找元素是否存在于集合中。
- 自动去重:由于
unordered_set
只存储唯一元素,它自动帮助我们去除重复的元素,这在很多场景下是非常有用的。 - 简化代码:使用
unordered_set
可以让代码更简洁,因为它提供了一些方便的方法来处理集合操作,无需手动实现这些操作。
因此,在解决这类涉及查找重复元素的问题时,可以考虑使用unordered_set
来解决。
2、替换空格
原题链接:05.替换空格
①代码实现(带注释)
//Code_流苏(CSDN)
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param s string字符串
* @return string字符串
*/
string replaceSpace(string s) {
//定义一个result结果字符串,用于最后返回新的字符串
string result;
//遍历字符串s
for (char c:s) {
//若s字符串中的c为空格,则将对应的result字符串中添加"%20,即将空格替换成了"%20"
if(c==' '){
result += "%20";
}else{
//若不是空格,则将当前的字符c,直接添加到result字符串里
result += c;
}
}
//经过上述遍历期间的if判断,成功将字符串替换成了题目要求的样式,此时我们return返回它即可
return result;
}
};
3、从尾到头打印链表
原题链接:06.从尾到头打印链表
①代码实现(带注释)
//Code_流苏(CSDN)
#include <vector>
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) :
* val(x), next(NULL) {
* }
* };
*/
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
//创建一个tempStack临时栈,暂存链表元素
stack<int> tempStack;
//创建一个向量容器result,用于存放最终的结果
vector<int> result;
//使用currentNode当前节点指针遍历链表
ListNode* currentNode = head;
//利用栈"后进先出"的特性来求解本题
//1.入栈
//若当前节点非空,遍历链表,直到节点为空处为止
while (currentNode != NULL) {
//将当前节点的值压入临时栈tempStack里
tempStack.push(currentNode->val);
//将当前节点向前走一步,即移动到下一个节点
currentNode = currentNode->next;
}
//2.出栈
//当临时栈tempStack不为空时,依次弹出栈顶元素并添加到结果向量容器result里
while (!tempStack.empty()) {
//将栈顶元素添加到result容器里
result.push_back(tempStack.top());
//弹出栈顶元素 或者说 释放掉临时栈中的元素
tempStack.pop();
}
//3.最后,返回的结果result,就是链表的逆序结果
return result;
}
};
②补充说明(vector)
vector是C++标准模板库(STL)中的一个序列容器,它可以存储连续存储的元素,允许随机访问,即可以直接通过索引访问元素。vector的元素存储在连续的内存空间中,这意味着它可以提供快速的元素访问,尤其是通过索引。vector是一个模板类,可以用来存储任意类型的元素,例如,vector<int>
用于存储整数类型的元素,而vector<string>
用于存储字符串。
vector提供了多种方法来操作容器中的元素,如:
- 添加元素:如
push_back()
方法,可以在vector的末尾添加一个元素。 - 删除元素:如
pop_back()
方法,可以删除vector末尾的元素。 - 访问元素:可以使用operator[]或at()方法通过索引访问元素。
- 迭代器:vector提供迭代器来遍历容器中的元素。
- 容量操作:如
size()
方法返回vector中的元素数量,resize()
方法可以改变vector的大小,capacity()
方法返回vector的容量,即它可以存储的元素数量不引发重新分配。
vector的动态数组特性意味着它可以根据需要自动调整其大小来容纳新元素。
原理:通过重新分配内存和复制现有元素到新的内存地址来实现的。但要注意,这样虽然提供了更多的灵活性,但在添加或删除元素时可能会导致性能开销,特别是在vector较大时。
很感谢你能看到这里,如有相关疑问,还请下方评论留言。
Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊)
如果对大家有帮助的话,希望大家能多多点赞+关注!这样我的动力会更足!