C/C++每日一练(20230405) 数组元素循环右移、输出字符图形、移除链表元素

简介: C/C++每日一练(20230405) 数组元素循环右移、输出字符图形、移除链表元素

1. 数组元素循环右移问题

题目:一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置(最后M个数循环移至最前面的M个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?

输入格式:

每个输入包含一个测试用例,第1行输入N(1≤N≤100)和M(≥0);第2行输入N个整数,之间用空格分隔。

输出格式:

在一行中输出循环右移M位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。

输入样例:

6 2
1 2 3 4 5 6

输出样例:

5 6 1 2 3 4

以下程序实现了这一功能,请你填补空白处内容:

```c++
#include <stdio.h>
int main()
{
    int n, m, a[1000];
    scanf("%d %d", &n, &m);
    m = m % n;
    int count = m;
    ______________;
    for (int i = 0; i < count; i++)
        scanf("%d", &a[i]);
    int first = 1;
    for (int i = 0; i < n; i++)
    {
        if (!first)
            printf(" ");
        printf("%d", a[i]);
        first = 0;
    }
}
```

出处:

https://edu.csdn.net/practice/24744548

代码:

c++

输出:

6 2

1 2 3 4 5 6

5 6 1 2 3 4


2. 输出字符图形

输入一个正整数n(代表图形的行数),输出如样例形式的图形。

输入:7

输出:

    D      D
    CD    DC
    BCD  DCB
    ABCDDCBA
    BCD  DCB
    CD    DC
    D      D

以下程序实现了这一功能,请你填补空白处内容:

```c++
#include <stdio.h>
#include <vector>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
    int n;
    cin >> n;
    vector<string> a(n, ""), b(n, "");
    int m = (n + 1) / 2;
    int p = 0;
    for (int i = m - 1; i >= 0; i--)
    {
        for (int j = 0; j <= i; j++)
            a[i].push_back('A' + j + p);
        b[i] = a[i];
        reverse(b[i].begin(), b[i].end());
        ___________________;
        p++;
    }
    p = 0;
    for (int i = n - 1; i >= m; i--)
    {
        a[i] = a[p];
        b[i] = b[p++];
    }
    for (int i = 0; i < n; i++)
        cout << a[i] << b[i] << endl;
    return 0;
}
```

出处:

https://edu.csdn.net/practice/24744549

代码:

#include <stdio.h>
#include <vector>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
    int n;
    cin >> n;
    vector<string> a(n, ""), b(n, "");
    int m = (n + 1) / 2;
    int p = 0;
    for (int i = m - 1; i >= 0; i--)
    {
        for (int j = 0; j <= i; j++)
            a[i].push_back('A' + j + p);
        b[i] = a[i];
        reverse(b[i].begin(), b[i].end());
    for (int j = i + 1; j < m; j++)
    {
        a[i] += " ";
        b[i] = " " + b[i];
    }
        p++;
    }
    p = 0;
    for (int i = n - 1; i >= m; i--)
    {
        a[i] = a[p];
        b[i] = b[p++];
    }
    for (int i = 0; i < n; i++)
        cout << a[i] << b[i] << endl;
    return 0;
}

输入输出:

7↙

D               D

CD          DC

BCD     DCB

ABCDDCBA

BCD     DCB

CD          DC

D               D


3. 移除链表元素

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点

示例 1:

输入:head = [1,2,6,3,4,5,6], val = 6

输出:[1,2,3,4,5]


示例 2:

输入:head = [], val = 1

输出:[]


示例 3:

输入:head = [7,7,7,7], val = 7

输出:[]


提示:

  • 列表中的节点数目在范围 [0, 10^4]
  • 1 <= Node.val <= 50
  • 0 <= val <= 50

出处:

https://edu.csdn.net/practice/24744550

代码:

#define null INT_MIN
#include <bits/stdc++.h>
using namespace std;
struct ListNode
{
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};
class Solution
{
public:
    ListNode *removeElements(ListNode *head, int val)
    {
        ListNode *dumynode = new ListNode(0);
        dumynode->next = head;
        ListNode *fast = dumynode->next;
        ListNode *slow = dumynode;
        while (fast != NULL)
        {
            if (fast->val == val)
            {
                slow->next = slow->next->next;
            }
            else
            {
                slow = slow->next;
            }
            fast = fast->next;
        }
        ListNode *ret = dumynode->next;
        delete dumynode;
        return ret;
    }
};
ListNode* buildNodeList(vector<int> vec) {
    ListNode *head = new ListNode(0);
    ListNode *p = head;
    for (size_t i = 0; i < vec.size(); i++) {
        ListNode *node = new ListNode(vec[i]);
        p->next = node;
        p = p->next;
    }
    return head->next;
}
string NodeList2String(ListNode *head) {
  if (head==NULL) return "[]";
    ListNode *p = head;
  string res = "[";
    while (p != nullptr) {
        res.append(to_string(p->val));
        res.append(",");
        p = p->next;
    }
    res.pop_back();
    res.append("]");
    return res;
}
int main()
{
  Solution s;
  vector<int> nums = {1,2,3,6,4,5,6};
  ListNode* root = buildNodeList(nums);
  cout << NodeList2String(s.removeElements(root, 6)) << endl;
  nums = {7,7,7,7,7};
  root = buildNodeList(nums);
  cout << NodeList2String(s.removeElements(root, 7)) << endl;
  return 0;
}

输出:

[1,2,3,4,5]

[]


🌟 每日一练刷题专栏 🌟

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

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

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

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

主页:https://hannyang.blog.csdn.net/


目录
相关文章
|
3月前
|
搜索推荐 编译器 C语言
【C++核心】特殊的元素集合-数组与字符串详解
这篇文章详细讲解了C++中数组和字符串的基本概念、操作和应用,包括一维数组、二维数组的定义和使用,以及C风格字符串和C++字符串类的对比。
101 4
|
5月前
|
存储 安全 编译器
【C++入门 四】学习C++内联函数 | auto关键字 | 基于范围的for循环(C++11) | 指针空值nullptr(C++11)
【C++入门 四】学习C++内联函数 | auto关键字 | 基于范围的for循环(C++11) | 指针空值nullptr(C++11)
|
5月前
|
存储 C++
C++的list-map链表与映射表
```markdown C++ 中的`list`和`map`提供链表和映射表功能。`list`是双向链表,支持头尾插入删除(`push_front/push_back/pop_front/pop_back`),迭代器遍历及任意位置插入删除。`map`是键值对集合,自动按键排序,支持直接通过键来添加、修改和删除元素。两者均能使用范围for循环遍历,`map`的`count`函数用于统计键值出现次数。 ```
|
6月前
|
算法 程序员 编译器
C++的四类循环分享
C++的四类循环:Entry or Exit controlled, Ranged-based or For_each
|
6月前
|
C++
C++一分钟之-循环结构:for与while循环
【6月更文挑战第18天】在C++中,`for`循环适合已知迭代次数,如数组遍历;`while`循环适用于条件驱动的未知次数循环。`for`以其初始化、条件和递增三部分结构简洁处理重复任务,而`while`则在需要先检查条件时更为灵活。常见错误包括无限循环和逻辑错误,解决办法是确保条件更新和正确判断。了解两者应用场景及陷阱,能提升代码效率和可读性。
70 6
|
6月前
|
C++
C++数组中插入元素。
C++数组中插入元素。
|
6月前
|
C语言 C++ 容器
c++primer plus 6 读书笔记 第五章 循环和关系表达式
c++primer plus 6 读书笔记 第五章 循环和关系表达式
|
6月前
|
存储 C++
C++的list-map链表与映射表
这篇教程介绍了C++中`list`链表和`map`映射表的基本使用。`list`链表可通过`push_front()`、`push_back()`、`pop_front()`和`pop_back()`进行元素的添加和删除,使用迭代器遍历并支持在任意位置插入或删除元素。`map`是一个键值对的集合,元素自动按键值排序,可使用下标操作符或`insert()`函数插入元素,通过迭代器遍历并修改键值对,同时提供`count()`方法统计键值出现次数。教程中包含多个示例代码以帮助理解和学习。
|
5月前
|
安全 编译器 C++
【C++】string类的使用②(元素获取Element access)
```markdown 探索C++ `string`方法:`clear()`保持容量不变使字符串变空;`empty()`检查长度是否为0;C++11的`shrink_to_fit()`尝试减少容量。`operator[]`和`at()`安全访问元素,越界时`at()`抛异常。`back()`和`front()`分别访问首尾元素。了解这些,轻松操作字符串!💡 ```
|
6月前
|
程序员 编译器 C++
探索C++语言宝库:解锁基础知识与实用技能(类型变量+条件循环+函数模块+OOP+异常处理)
探索C++语言宝库:解锁基础知识与实用技能(类型变量+条件循环+函数模块+OOP+异常处理)
49 0