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/


目录
相关文章
【力扣】-- 移除链表元素
【力扣】-- 移除链表元素
164 1
|
搜索推荐 编译器 C语言
【C++核心】特殊的元素集合-数组与字符串详解
这篇文章详细讲解了C++中数组和字符串的基本概念、操作和应用,包括一维数组、二维数组的定义和使用,以及C风格字符串和C++字符串类的对比。
357 5
|
6月前
|
存储
203. 移除链表元素,707.设计链表,206. 反转链表
链表是数据结构中的重要概念,包含单链表、双链表和循环链表。单链表每个节点存储数据与下一节点指针;双链表增加上一节点指针;循环链表首尾相连。 **例题解析:** 1. **203. 移除链表元素**:通过遍历链表删除指定值节点,注意处理头节点特殊情况。 2. **707. 设计链表**:实现链表的增删查操作,需理解指针操作逻辑,避免直接修改目标节点。 3. **206. 反转链表**:采用双指针或递归方法改变节点指向,完成链表反转。 以上题目涵盖链表核心操作,掌握后可灵活应对相关问题。
|
程序员
【刷题记录】移除链表元素
【刷题记录】移除链表元素
115 0
|
11月前
|
存储 算法 搜索推荐
【C++面向对象——群体类和群体数据的组织】实现含排序功能的数组类(头歌实践教学平台习题)【合集】
1. **相关排序和查找算法的原理**:介绍直接插入排序、直接选择排序、冒泡排序和顺序查找的基本原理及其实现代码。 2. **C++ 类与成员函数的定义**:讲解如何定义`Array`类,包括类的声明和实现,以及成员函数的定义与调用。 3. **数组作为类的成员变量的处理**:探讨内存管理和正确访问数组元素的方法,确保在类中正确使用动态分配的数组。 4. **函数参数传递与返回值处理**:解释排序和查找函数的参数传递方式及返回值处理,确保函数功能正确实现。 通过掌握这些知识,可以顺利地将排序和查找算法封装到`Array`类中,并进行测试验证。编程要求是在右侧编辑器补充代码以实现三种排序算法
271 5
|
存储 算法
LeetCode第83题删除排序链表中的重复元素
文章介绍了LeetCode第83题"删除排序链表中的重复元素"的解法,使用双指针技术在原链表上原地删除重复元素,提供了一种时间和空间效率都较高的解决方案。
LeetCode第83题删除排序链表中的重复元素
C++(十一)对象数组
本文介绍了C++中对象数组的使用方法及其注意事项。通过示例展示了如何定义和初始化对象数组,并解释了栈对象数组与堆对象数组在初始化时的区别。重点强调了构造器设计时应考虑无参构造器的重要性,以及在需要进一步初始化的情况下采用二段式初始化策略的应用场景。
【数据结构OJ题】移除链表元素
力扣题目——移除链表元素
132 2
【数据结构OJ题】移除链表元素
|
算法 C++
c++学习笔记04 数组
这篇文章是C++学习笔记4,主题是数组。
163 4