【LeetCode】C++:新手村题单记录-重在解出问题-创新互联
每个问题都先自己进行尝试,在解决问题后或者解题遇到卡顿时再去查看别人的题解和讨论帖,对于新手的你重点是先能够解出题目而不是寻找最优的解题思路。
成都创新互联公司专注于企业全网营销推广、网站重做改版、浈江网站定制设计、自适应品牌网站建设、H5响应式网站、购物商城网站建设、集团公司官网建设、成都外贸网站制作、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为浈江等各大城市提供网站开发制作服务。目录
1480.一维数组的动态求和
383. 赎金信
412. Fizz Buzz
876. 链表的中间结点
1342. 将数字变成 0 的操作次数
1672. 最富有客户的资产总量
1480.一维数组的动态求和
给你一个数组 nums
。数组「动态和」的计算公式为:runningSum[i] = sum(nums[0]…nums[i])
。请返回 nums
的动态和。
class Solution {
public:
vectorrunningSum(vector& nums) {
vectorsum;
int flag = 0;
for(int i=0; irunningSum(vector& nums) {
int n = nums.size();
for (int i = 1; i< n; i++) {
nums[i] += nums[i - 1];
}
return nums;
}
};
//其他
class Solution {
public:
vectorrunningSum(vector& nums) {
int sumn = 0;
vectorret;
for (int i = 0; i< nums.size(); i++) {
sumn += nums[i];
ret.push_back(sumn);
}
return ret;
}
};
解析:
1.第一眼容器嵌套容器框架
【C++提高编程】第二章 STL初识:概念|组件|容器基础
2.push_back:将容器元素插入到vector
3.官方解析
383. 赎金信
给你两个字符串:ransomNote
和 magazine
,判断 ransomNote
能不能由 magazine
里面的字符构成。如果可以,返回 true
;否则返回 false
。magazine
中的每个字符只能在 ransomNote
中使用一次。
思考:
字符串:ransomNote;magazine
判断:magazine字符串能否组成ransomnote字符串,同时字符串使用次数为1
过程:
考虑ransomnote字符串情况:
- 为空?True;
- 长度大于magazine字符串,False;
- 长度短于magazine字符串,循环遍历删除:
- 外遍历ransomNote字符串
- 内遍历magazine字符串,不存在,False;存在,删除该字符;【难点】
- 循环继续。
调研学习:哈希表法
优点:把数据的存储和查找消耗的时间大大降低,几乎可以看成是常数时间;而代价仅仅是消耗比较多的内存。编码比较容易也是它的特点之一。
基本原理:使用一个下标范围比较大的数组来存储元素。可以设计一个函数(哈希函数,也叫做散列函数),使得每个元素的关键字都与一个函数值(即数组下标,hash值)相对应,于是用这个数组单元来存储这个元素;也简单理解为,按照关键字为每一个元素“分类”,然后将这个元素存储在相应“类”所对应的地方,称为桶。
但是,不能够保证每个元素的关键字与函数值是一一对应的,因此极有可能出现对于不同的元素,却计算出了相同的函数值,这样就产生了“冲突”,换句话说,就是把不同的元素分在了相同的“类”之中。 总的来说,“直接定址”与“解决冲突”是哈希表的两大特点。
1.分配内存,26个字母;memset:初始化是将数组cnt的每个元素赋值0。
2.magazine的字符计数;auto的原理就是根据后面的值,来自己推测前面的类型是什么。遍历找出字符串的每个字符的重复的个数!
3.ransomnote使用magazine的字符,同时计数减1
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
//1.分配内存,26个字母;
//memset:初始化是将数组cnt的每个元素赋值0。
int cnt[26];
memset(cnt, 0, sizeof(cnt));
//2.magazine的字符计数
//auto的原理就是根据后面的值,来自己推测前面的类型是什么。
//遍历找出字符串的每个字符的重复的个数!
for(auto c:magazine){
cnt[c-'a']++;
}
//3.ransomnote使用magazine的字符,同时计数减1
for(auto c:ransomNote){
if(--cnt[c-'a']<0) return false;
}
return true;
}
};
【官方】
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
if (ransomNote.size() >magazine.size()) {
return false;
}
vectorcnt(26);
for (auto & c : magazine) {
cnt[c - 'a']++;
}
for (auto & c : ransomNote) {
cnt[c - 'a']--;
if (cnt[c - 'a']< 0) {
return false;
}
}
return true;
}
};
【新手C++】383. 赎金信
//错误待修改!
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
//1.ransomnote字符长度为0
if(ransomNote.size()==0)
{
return true;
}
//2.ransomnote字符长度magazine
if(ransomNote.size()>magazine.size())
{
return false;
}
//3.判断
if(ransomNote.size()< magazine.size())
{
for(int i = 0; i
412. Fizz Buzz
给你一个整数 n
,找出从 1
到 n
各个整数的 Fizz Buzz 表示,并用字符串数组 answer
(下标从 1 开始)返回结果,其中:
answer[i] == "FizzBuzz"
如果i
同时是3
和5
的倍数。answer[i] == "Fizz"
如果i
是3
的倍数。answer[i] == "Buzz"
如果i
是5
的倍数。answer[i] == i
(以字符串形式)如果上述条件全不满足。- 输入:n = 5
- 输出:["1","2","Fizz","4","Buzz"]
思考:
有点类水仙花数思路,分情况讨论即可。
输出要求:类逢7拍手游戏。
class Solution {
public:
vectorfizzBuzz(int n) {
//1.答案容器
vectoranswer;
//2.遍历1~n
for(int i = 1; i<=n; i++){
string curr;
if(i % 3 == 0 ){
curr += "Fizz";
}
if( i % 5 == 0){
curr += "Buzz";
}
if(curr.size() == 0){
//to_string将数字常量转换为字符串,返回值为转换完毕的字符串
curr += to_string(i);
}
//3.向容器添加数据,C++ 11,区别 push_back, push_front
answer.emplace_back(curr);
}
return answer;
}
};
876. 链表的中间结点
给定一个头结点为 head
的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。
示例 1:
- 输入:[1,2,3,4,5]
- 输出:此列表中的结点 3 (序列化形式:[3,4,5]) 返回的结点值为 3 。
思考:
链表:无法通过下标访问对应的元素。
遍历?同时将遍历到的元素依次放入数组 A 中。如果我们遍历到了 N 个元素,那么链表以及数组的长度也为 N,对应的中间节点即为 A[N/2]。
【官方】其他:快慢指针!
class Solution {
public:
ListNode* middleNode(ListNode* head) {
vectorA={head};
//1.back()返回的的是最后一个元素的引用。
while(A.back()->next !=NULL)
//2.push_back容器末尾添加一个新的元素进去
A.push_back(A.back()->next);
return A[A.size()/2];
}
};
1342. 将数字变成 0 的操作次数
给你一个非负整数 num
,请你返回将它变成 0 所需要的步数。 如果当前数字是偶数,你需要把它除以 2 ;否则,减去 1 。
思考:
判断奇偶数,对应不同的操作:
- 偶数:除以2;
- 奇数:减1;
- 循环while思路,基础思路。
class Solution {
public:
int numberOfSteps(int num) {
int res = 0 ;
while(num >0){
if(num % 2 == 0){
num = num/2;
}
else {
num--;
}
res++;
}
return res;
}
};
1672. 最富有客户的资产总量
给你一个 m x n
的整数网格 accounts
,其中 accounts[i][j]
是第 i
位客户在第 j
家银行托管的资产数量。返回最富有客户所拥有的 资产总量 。客户的 资产总量 就是他们在各家银行托管的资产数量之和。最富有客户就是 资产总量 大的客户。
思考:
这题乍一看数组求和取最值?
1.二维数组行数 accounts.size()
2.二维数组列数 accounts[0].size()
3.遍历求和
4.取最值
class Solution {
public:
int maximumWealth(vector>& accounts) {
int rich =0;
for(int i=0; i
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
网站标题:【LeetCode】C++:新手村题单记录-重在解出问题-创新互联
浏览路径:http://azwzsj.com/article/cccosj.html