每个问题都先自己进行尝试,在解决问题后或者解题遇到卡顿时再去查看别人的题解和讨论帖,对于新手的你重点是先能够解出题目而不是寻找最优的解题思路。
目录
给你一个数组 nums 。数组「动态和」的计算公式为:runningSum[i] = sum(nums[0]…nums[i]) 。请返回 nums 的动态和。
- class Solution {
- public:
- vector<int> runningSum(vector<int>& nums) {
- vector<int> sum;
- int flag = 0;
- for(int i=0; i<size(nums); i++){
- sum.push_back(flag+nums[i]);
- flag = flag+nums[i];
- }
- return sum;
- }
- };
-
- //官方
- class Solution {
- public:
- vector<int> runningSum(vector<int>& nums) {
- int n = nums.size();
- for (int i = 1; i < n; i++) {
- nums[i] += nums[i - 1];
- }
- return nums;
- }
- };
- //其他
- class Solution {
- public:
- vector<int> runningSum(vector<int>& nums) {
- int sumn = 0;
- vector<int> ret;
- for (int i = 0; i < nums.size(); i++) {
- sumn += nums[i];
- ret.push_back(sumn);
- }
- return ret;
- }
- };
解析:
1.第一眼容器嵌套容器框架
2.push_back:将容器元素插入到vector
3.官方解析
给你两个字符串: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;
- }
- vector<int> cnt(26);
- for (auto & c : magazine) {
- cnt[c - 'a']++;
- }
- for (auto & c : ransomNote) {
- cnt[c - 'a']--;
- if (cnt[c - 'a'] < 0) {
- return false;
- }
- }
- return true;
- }
- };
- //错误待修改!
- 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
size();i++){ - for(int j = 0; j
size();j++){ - if(ransomNote[i]==magazine[j]){
- //需要匹配完删除,但会影响magazine长度!存疑!
- magazine[j]='0';//换写?
- continue;}
- return true; }
- return false;
- } }
- return false;
- }
- };
给你一个整数 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 (以字符串形式)如果上述条件全不满足。思考:
有点类水仙花数思路,分情况讨论即可。
输出要求:类逢7拍手游戏。
- class Solution {
- public:
- vector
fizzBuzz(int n) { - //1.答案容器
- vector
answer; - //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;
- }
- };
给定一个头结点为 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。
示例 1:
思考:
链表:无法通过下标访问对应的元素。
遍历?同时将遍历到的元素依次放入数组 A 中。如果我们遍历到了 N 个元素,那么链表以及数组的长度也为 N,对应的中间节点即为 A[N/2]。
- class Solution {
- public:
- ListNode* middleNode(ListNode* head) {
- vector
A={head}; - //1.back()返回的的是最后一个元素的引用。
- while(A.back()->next !=NULL)
- //2.push_back容器末尾添加一个新的元素进去
- A.push_back(A.back()->next);
- return A[A.size()/2];
- }
- };
给你一个非负整数 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;
- }
- };
给你一个 m x n 的整数网格 accounts ,其中 accounts[i][j] 是第 i 位客户在第 j 家银行托管的资产数量。返回最富有客户所拥有的 资产总量 。客户的 资产总量 就是他们在各家银行托管的资产数量之和。最富有客户就是 资产总量 最大的客户。
思考:
这题乍一看数组求和取最值?
1.二维数组行数 accounts.size()
2.二维数组列数 accounts[0].size()
3.遍历求和
4.取最值
- class Solution {
- public:
- int maximumWealth(vector
int >>& accounts) { - int rich =0;
- for(int i=0; i
size();i++){ - int sum =0;
- for(int j=0; j
0].size();j++){ - sum += accounts[i][j];
- }
- rich = max(rich, sum);
- }
- return rich;
- }
- };