C/C++每日一练(20230319)
目录
1. 反转链表 II 🌟🌟
2. 解码方法 🌟🌟
3. 擅长编码的小k 🌟🌟🌟
🌟 每日一练刷题专栏 🌟
Golang每日一练 专栏
Python每日一练 专栏
C/C++每日一练 专栏
Java每日一练 专栏
1. 反转链表 II
给你单链表的头指针 head
和两个整数 left
和 right
,其中 left <= right
。请你反转从位置 left
到位置 right
的链表节点,返回 反转后的链表 。
示例 1:
输入:head = [1,2,3,4,5], left = 2, right = 4 输出:[1,4,3,2,5]
示例 2:
输入:head = [5], left = 1, right = 1 输出:[5]
提示:
- 链表中节点数目为
n
1 <= n <= 500
-500 <= Node.val <= 500
1 <= left <= right <= n
进阶: 你可以使用一趟扫描完成反转吗?
出处:
https://edu.csdn.net/practice/23155429
代码:
#include <stdio.h>
#include <stdlib.h>
struct ListNode
{
int val;
struct ListNode *next;
};
static struct ListNode *reverseBetween(struct ListNode *head, int m, int n)
{
int i;
struct ListNode dummy;
struct ListNode *prev = &dummy;
prev->next = head;
for (i = 1; i < m; i++)
{
prev = prev->next;
}
struct ListNode *p = prev->next;
for (i = m; i < n; i++)
{
struct ListNode *q = p->next;
p->next = q->next;
q->next = prev->next;
prev->next = q;
}
return dummy.next;
}
int main()
{
struct ListNode dummy;
struct ListNode *prev = &dummy;
struct ListNode *p;
int arr[] = {1,2,3,4,5};
int count = sizeof(arr)/sizeof(arr[0]);
for (int i = 0; i < count; i++)
{
p = (ListNode*)malloc(sizeof(*p));
p->val = arr[i];
p->next = NULL;
prev->next = p;
prev = p;
}
int m = 2;
int n = 4;
struct ListNode *head = reverseBetween(dummy.next, m, n);
for (p = head; p != NULL; p = p->next)
{
printf("%d ", p->val);
}
printf("\n");
return 0;
}
输出:
1 4 3 2 5
2. 解码方法
一条包含字母 A-Z
的消息通过以下映射进行了 编码 :
'A' -> 1'B' -> 2...'Z' -> 26
要 解码 已编码的消息,所有数字必须基于上述映射的方法,反向映射回字母(可能有多种方法)。例如,"11106"
可以映射为:
"AAJF"
,将消息分组为(1 1 10 6)
"KJF"
,将消息分组为(11 10 6)
注意,消息不能分组为 (1 11 06)
,因为 "06"
不能映射为 "F"
,这是由于 "6"
和 "06"
在映射中并不等价。
给你一个只含数字的 非空 字符串 s
,请计算并返回 解码 方法的 总数 。
题目数据保证答案肯定是一个 32 位 的整数。
示例 1:
输入:s = "12" 输出:2 解释:它可以解码为 "AB"(1 2)或者 "L"(12)。
示例 2:
输入:s = "226" 输出:3 解释:它可以解码为 "BZ" (2 26), "VF" (22 6), 或者 "BBF" (2 2 6) 。
示例 3:
输入:s = "0" 输出:0 解释:没有字符映射到以 0 开头的数字。含有 0 的有效映射是 'J' -> "10" 和 'T'-> "20" 。由于没有字符,因此没有有效的方法对此进行解码,因为所有数字都需要映射。
示例 4:
输入:s = "06" 输出:0 解释:"06" 不能映射到 "F" ,因为字符串含有前导 0("6" 和 "06" 在映射中并不等价)。
提示:
1 <= s.length <= 100
s
只包含数字,并且可能包含前导零。
出处:
https://edu.csdn.net/practice/23155430
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static int numDecodings(char *s)
{
int len = strlen(s);
if (len == 0)
{
return 0;
}
int a = 1;
int b = s[0] == '0' ? 0 : a;
int c = b;
for (int i = 2; i <= len; i++)
{
c = s[i - 1] == '0' ? 0 : b;
int num = (s[i - 2] - '0') * 10 + (s[i - 1] - '0');
if (num >= 10 && num <= 26)
{
c += a;
}
a = b;
b = c;
}
return c;
}
int main()
{
printf("%d\n", numDecodings((char*)"12"));
printf("%d\n", numDecodings((char*)"226"));
printf("%d\n", numDecodings((char*)"0"));
printf("%d\n", numDecodings((char*)"06"));
return 0;
}
输出:
2
3
0
0
3. 擅长编码的小k
小k不仅擅长数学,也擅长编码。有一种编码方式如下:
首先写下文本中间的字符(如果文本中的字符编号为1..n,那么中间一个字符的编号为(n+1)DIV 2,其中DIV为整除的意思),然后 用这个方法递归地写下左边,最后再按这个方法递归地写下右边。例如,单词为orthography则其编码为gtorhoprahy。即先写中间的那个字符g,再对ortho递归地编码,最后将raphy递归地编码就得到了gtorhoprahy。
给一个原来的文本,求出编码后的 文本。
输入
一行字符,表示原始的文本内容。
输出
一行字符,表示编码后的文本内容。
样例
输入
orthography
输出
gtorhoprahy
提示
100%的数据,字符串长度不超过20000
出处:
https://edu.csdn.net/practice/23155431
代码:
#include <iostream>
#include <cstring>
using namespace std;
void shuchu(char *a, int m, int n)
{
if (n <= 0 || m <= 0 || m > n)
{
return;
}
else
{
cout << a[(m + n) / 2];
shuchu(a, m, (m + n) / 2 - 1);
shuchu(a, (m + n) / 2 + 1, n);
}
}
int main()
{
char a[20000];
char b[20001];
cin >> a;
for (int i = 0; i < 20000; i++)
{
b[i + 1] = a[i];
}
int n = strlen(a);
shuchu(b, 1, n);
return 0;
}
输入输出:
orthography
gtorhoprahy
🌟 每日一练刷题专栏 🌟
✨ 持续,努力奋斗做强刷题搬运工!
👍 点赞,你的认可是我坚持的动力!
🌟 收藏,你的青睐是我努力的方向!
✎ 评论,你的意见是我进步的财富!
Golang每日一练 专栏 | |
Python每日一练 专栏 | |
C/C++每日一练 专栏 | |
Java每日一练 专栏 |