C/C++每日一练(20230319)

简介: C/C++每日一练(20230319)

1. 反转链表 II


给你单链表的头指针 head 和两个整数 leftright ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表


示例 1:

c664df96e99b9097662307d2e0368322.jpeg


输入: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

目录
相关文章
|
7月前
|
Linux 监控 Ubuntu
Linux 终端操作命令(1)
Linux 终端操作命令(1)
99 1
Linux 终端操作命令(1)
|
7月前
|
算法 Java Go
Rust每日一练(Leetday0018) N皇后II、最大子数组和、螺旋矩阵
Rust每日一练(Leetday0018) N皇后II、最大子数组和、螺旋矩阵
51 1
Rust每日一练(Leetday0018) N皇后II、最大子数组和、螺旋矩阵
|
7月前
|
Linux 监控 Shell
Linux 终端命令之文件浏览(4) head, tail
Linux 终端命令之文件浏览(4) head, tail
63 0
Linux 终端命令之文件浏览(4) head, tail
|
7月前
|
Shell Linux 机器学习/深度学习
Linux 终端操作命令(3)内部命令用法
Linux 终端操作命令(3)内部命令用法
98 0
Linux 终端操作命令(3)内部命令用法
|
7月前
|
Python Linux Ubuntu
Linux系统部署Python语言开发运行环境
Linux系统部署Python语言开发运行环境
225 0
Linux系统部署Python语言开发运行环境
|
7月前
|
Go Unix 开发者
Go语言time库,时间和日期相关的操作方法
Go语言time库,时间和日期相关的操作方法
103 0
Go语言time库,时间和日期相关的操作方法
|
7月前
|
C++ 存储 Serverless
力扣C++|一题多解之数学题专场(2)
力扣C++|一题多解之数学题专场(2)
50 0
力扣C++|一题多解之数学题专场(2)
|
7月前
|
Go 机器学习/深度学习 Rust
Golang每日一练(leetDay0119) 反转字符串I\II Reverse String
Golang每日一练(leetDay0119) 反转字符串I\II Reverse String
90 0
Golang每日一练(leetDay0119) 反转字符串I\II Reverse String
|
7月前
|
Java Go C++
Golang每日一练(leetDay0115) 重新安排行程、递增的三元子序列
Golang每日一练(leetDay0115) 重新安排行程、递增的三元子序列
66 0
Golang每日一练(leetDay0115) 重新安排行程、递增的三元子序列
|
7月前
|
Java Go C++
Golang每日一练(leetDay0111) 摆动排序II\I Wiggle Sort
Golang每日一练(leetDay0111) 摆动排序II\I Wiggle Sort
60 0
Golang每日一练(leetDay0111) 摆动排序II\I Wiggle Sort