C/C++每日一练(20230313)
创始人
2024-06-02 14:35:00
0

目录

1. 旋转链表  ★★

2. 跳跃游戏  ★

3. 求根节点到叶节点数字之和  ★★★

🌟 每日一练刷题专栏

C/C++ 每日一练 ​专栏

Python 每日一练 专栏


1. 旋转链表

给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。

示例 1:

输入:head = [1,2,3,4,5], k = 2
输出:[4,5,1,2,3]

示例 2:

输入:head = [0,1,2], k = 4
输出:[2,0,1]

提示:

  • 链表中节点的数目在范围 [0, 500] 内
  • -100 <= Node.val <= 100
  • 0 <= k <= 2 * 10^9
#include 
using namespace std;struct ListNode
{int val;ListNode *next;ListNode() : val(0), next(nullptr) {}ListNode(int x) : val(x), next(nullptr) {}ListNode(int x, ListNode *next) : val(x), next(next) {}
};class Solution
{
public:ListNode *rotateRight(ListNode *head, int k){if (head == nullptr){return head;}int len = 0;ListNode dummy;dummy.next = head;ListNode *tail = &dummy;while (tail->next != nullptr){len++;tail = tail->next;}ListNode *prev = &dummy;ListNode *p = head;k = k % len;for (int i = 0; i < len - k; i++){prev = p;p = p->next;}if (p != nullptr){prev->next = tail->next;tail->next = head;head = p;}return head;}
};ListNode* createLinkedList(vector& vec) {if (vec.empty()) {return NULL;}ListNode* head = new ListNode(vec[0]);ListNode* curNode = head;for (int i = 1; i < vec.size(); i++) {curNode->next = new ListNode(vec[i]);curNode = curNode->next;}return head;
}void printLinkedList(ListNode* head) {ListNode* curNode = head;while (curNode != NULL) {cout << curNode->val << " -> ";curNode = curNode->next;}cout << "NULL" << endl;
}string LList2String(ListNode* head) {ListNode* curNode = head;int size = 0;string res = "[";while (curNode != NULL) {res += size++ > 0 ? "," : "";res += to_string(curNode->val);curNode = curNode->next;}return res + "]";
}int main()
{Solution s;vector nums = {1,2,3,4,5};ListNode* head = createLinkedList(nums);printLinkedList(head);head = s.rotateRight(head, 2);printLinkedList(head);cout << LList2String(head) << endl;nums = {0,1,2};head = createLinkedList(nums);printLinkedList(head);head = s.rotateRight(head, 4);printLinkedList(head);cout << LList2String(head) << endl;return 0;
} 

输出:

1 -> 2 -> 3 -> 4 -> 5 -> NULL
4 -> 5 -> 1 -> 2 -> 3 -> NULL
[4,5,1,2,3]
0 -> 1 -> 2 -> NULL
2 -> 0 -> 1 -> NULL
[2,0,1]


2. 跳跃游戏

给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

判断你是否能够到达最后一个下标。

示例 1:

输入:nums = [2,3,1,1,4]
输出:true
解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。

示例 2:

输入:nums = [3,2,1,0,4]
输出:false
解释:无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 , 所以永远不可能到达最后一个下标。

提示:

  • 1 <= nums.length <= 3 * 10^4
  • 0 <= nums[i] <= 10^5

代码: 

#include 
#include 
#include static inline int max(int a, int b)
{return a > b ? a : b;
}static bool canJump(int *nums, int numsSize)
{int i, pos = 0;for (i = 0; i < numsSize - 1; i++){if (pos < i || pos >= numsSize - 1){continue;}pos = max(i + nums[i], pos);}return pos >= numsSize - 1;
}int main()
{int nums1[5] = {2,3,1,1,4};printf("%s\n", canJump(nums1, 5) ? "true" : "false");int nums2[5] = {3,2,1,0,4};printf("%s\n", canJump(nums2, 5) ? "true" : "false");return 0;
}

输出: 

true
false


3. 求根节点到叶节点数字之和

给你一个二叉树的根节点 root ,树中每个节点都存放有一个 0 到 9 之间的数字。

每条从根节点到叶节点的路径都代表一个数字:

例如,从根节点到叶节点的路径 1 -> 2 -> 3 表示数字 123 。

计算从根节点到叶节点生成的 所有数字之和 。

叶节点 是指没有子节点的节点。

示例 1:

输入:root = [1,2,3]
输出:25
解释:
从根到叶子节点路径 1->2 代表数字 12
从根到叶子节点路径 1->3 代表数字 13
因此,数字总和 = 12 + 13 = 25

示例 2:

输入:root = [4,9,0,5,1]
输出:1026
解释:
从根到叶子节点路径 4->9->5 代表数字 495
从根到叶子节点路径 4->9->1 代表数字 491
从根到叶子节点路径 4->0 代表数字 40
因此,数字总和 = 495 + 491 + 40 = 1026

提示:

  • 树中节点的数目在范围 [1, 1000] 内
  • 0 <= Node.val <= 9
  • 树的深度不超过 10

代码:

#include 
#define null INT_MIN
using namespace std;struct TreeNode
{int val;TreeNode *left;TreeNode *right;TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};class Solution
{
public:int sumNumbers(TreeNode *root){if (root == nullptr)return 0;int result = 0;vector num;vector temp;recursive(root, &num, &temp);for (int i = 0; i < num.size(); i++){result = result + num[i];}return result;}void recursive(TreeNode *root, vector *num, vector *temp){temp->push_back(root->val);if (root->left == nullptr && root->right == nullptr){int sum = 0;for (int i = temp->size() - 1; i >= 0; i--){int howi = (*temp)[i];sum = sum + howi * pow(10, (temp->size() - i - 1));}num->push_back(sum);temp->pop_back();return;}if (root->left) recursive(root->left, num, temp);if (root->right) recursive(root->right, num, temp);temp->pop_back();}
};TreeNode* buildTree(vector& nums)
{if (nums.empty()) return nullptr;TreeNode *root = new TreeNode(nums.front());queue q;q.push(root);int i = 1;while(!q.empty() && i < nums.size()){TreeNode *cur = q.front();q.pop();if(i < nums.size() && nums[i] != null){cur->left = new TreeNode(nums[i]);q.push(cur->left);}i++;if(i < nums.size() && nums[i] != null){cur->right = new TreeNode(nums[i]);q.push(cur->right);}i++;}return root;
}int main()
{Solution s;vector nums = {1,2,3};TreeNode* root = buildTree(nums);cout << s.sumNumbers(root) << endl;nums = {4,9,0,5,1};root = buildTree(nums);cout << s.sumNumbers(root) << endl;return 0;
}

输出:

25
1026

非递归法: stack / DFS

从根节点开始遍历二叉树,记录当前路径上的数字,如果遇到叶子节点,则将该数字加入结果中。最后返回所有叶子节点对应的数字之和即可。

#include 
#define null INT_MIN
using namespace std;struct TreeNode
{int val;TreeNode *left;TreeNode *right;TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};class Solution
{
public:int sumNumbers(TreeNode *root){if (root == nullptr)return 0;int result = 0;vector num;stack>> st;st.push(make_pair(root, vector{}));while (!st.empty()){auto node = st.top().first;auto temp = st.top().second;st.pop();temp.push_back(node->val);if (node->left == nullptr && node->right == nullptr){int sum = 0;for (int i = temp.size() - 1; i >= 0; i--){int howi = temp[i];sum = sum + howi * pow(10, (temp.size() - i - 1));}num.push_back(sum);}if (node->left) st.push(make_pair(node->left, temp));if (node->right) st.push(make_pair(node->right, temp));}for (int i = 0; i < num.size(); i++){result = result + num[i];}return result;}
};TreeNode* buildTree(vector& nums)
{if (nums.empty()) return nullptr;TreeNode *root = new TreeNode(nums.front());queue q;q.push(root);int i = 1;while(!q.empty() && i < nums.size()){TreeNode *cur = q.front();q.pop();if(i < nums.size() && nums[i] != null){cur->left = new TreeNode(nums[i]);q.push(cur->left);}i++;if(i < nums.size() && nums[i] != null){cur->right = new TreeNode(nums[i]);q.push(cur->right);}i++;}return root;
}int main()
{Solution s;vector nums = {1,2,3};TreeNode* root = buildTree(nums);cout << s.sumNumbers(root) << endl;nums = {4,9,0,5,1};root = buildTree(nums);cout << s.sumNumbers(root) << endl;nums = {4,9,0,null,null,5,1};root = buildTree(nums);cout << s.sumNumbers(root) << endl;return 0;
}

输出:

25
1026
855


🌟 每日一练刷题专栏

 持续,努力奋斗做强刷题搬运工!

👍 点赞,你的认可是我坚持的动力! 

🌟 收藏,你的青睐是我努力的方向! 

 评论,你的意见是我进步的财富!  

​​​

C/C++ 每日一练 ​专栏

​​​​

Python 每日一练 专栏

相关内容

热门资讯

【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
AsusVivobook无法开... 首先,我们可以尝试重置BIOS(Basic Input/Output System)来解决这个问题。...
ASM贪吃蛇游戏-解决错误的问... 要解决ASM贪吃蛇游戏中的错误问题,你可以按照以下步骤进行:首先,确定错误的具体表现和问题所在。在贪...
月入8000+的steam搬砖... 大家好,我是阿阳 今天要给大家介绍的是 steam 游戏搬砖项目,目前...