4. 移动到末尾(蓝桥云课)

题目描述

给定一个数组,实现一个算法将数组中的所有 0 移动到末尾,但不可改变非 0 数字的相对位置。介绍如下:

  • 例如数组为 [0, 1, 0, 3, 12],将所有 0 移动到末尾的结果为 [1, 3, 12, 0, 0]。

输入描述

第一行输入一个数字 N (1<N<1000)N (1<N<1000),为数组的长度。

第二行输入数组的元素 AiAi​,0<Ai<10000<Ai​<1000。

输出描述

输出一行,为移动后数组。

输入输出样例

示例

输入

5
0 1 0 3 12

输出

1 3 12 0 0

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 256M

方法一(推荐):用一种双指针的思维去从头开始填充数组

#include <iostream>
using namespace std;
int main()
{
  // 请在此输入您的代码
  int n;
  cin >> n;
  int arr[n];
  for (int i = 0; i < n; i++)
    cin >> arr[i];

  //以后碰到这种移位的题目,统一用双指针,先用一个指针,把所有非0的数字往前移,再从指针的位置补上0
  int j = 0;
  for (int i = 0; i < n; i++) //j作为判断的指针
  {
      if (arr[i]) arr[j++] = arr[i];
  }

  while(j < n) arr[j++] = 0;

    for (int i = 0; i < n; i++)
    cout << arr[i] << " ";
  return 0;
}

方法二:遇到就输出

既然我们要保存非0的相对位置不变,但又需要把0全放在后面,那我们不妨遍历一遍数组,碰到非0的数字就输出,在这过程中计数,最后把0的数目输出出来

#include <iostream>
using namespace std;
int main()
{
  // 请在此输入您的代码
  int n;
  cin >> n;
  int arr[n];
  int cnt = 0;

  for (int i = 0; i < n; i++)//读入
    cin >> arr[i];

  for(int i = 0; i < n; i++)//碰到就输出
  {
    if (arr[i]) {
        cout << arr[i] << " ";
        cnt++;
    }
  }

  while(cnt < n)//把0补全
  {
    cout << 0 << " ";
    cnt++;
  }
  return 0;
}

方法三(不推荐):遇到0的时候将0移动到最后一位,并且将所有数字往前移动一格

这种方法对性能的开销大,因为要移动数组,数组如果很大就不好了,当然对于这道题数字很小,可以这么做。这种方法有一个值得注意的点,就是当0连续存在的时候,你需要做一些保守的判断,不然会遗漏掉0.

#include <iostream>
using namespace std;
int main()
{
  // 请在此输入您的代码
  int n;
  cin >> n;
  int arr[n];
  int cnt = 0;  //统计0出现了多少次

  for (int i = 0; i < n; i++)//读入
    cin >> arr[i];

  for (int i = 0; i < n - cnt; i++) //这里i要走过n-cnt个,把0排除掉,不然进入死循环
  {
      if (arr[i] == 0) 
      {
          for (int j = i; j < n - 1; j++) {
              arr[j] = arr[j + 1];
          }
          arr[n - 1] = 0;
          i--;  //i--很重要,这是一个保守判断,排除有连续的0的情况
          cnt++;  //这里cnt是标记0的个数
      }
  }

  for (int i = 0; i < n; i++)
    cout << arr[i] << " ";
  return 0;
}

这里如果搞不明白为什么i--有这个作用,可以看我的另一篇题解,里面有详细解释i--的作用

PTA习题8-6删除字符(20分)(两种思路)_本题要求实现一个删除字符串中的指定字符的简单函数。-优快云博客

<think>好的,用户想了解蓝桥云课编号3496的课程内容解析。首先,我需要确认这个课程的具体信息,但根据提供的引用材料,用户可能没有直接给出3496的内容,所以可能需要根据现有引用合理推测。 引用[1]提到蓝桥云课将实验文档和实验环境结合,用户需要逐步完成练习。引用[2]和[3]则涉及ROS机器人和Arduino开发环境的内容。因此,3496课程可能属于ROS或嵌入式开发相关,可能涉及实验步骤、环境搭建等。 接下来,我需要按照用户的要求生成相关问题,确保问题与课程内容相关。例如,关于课程结构、实验内容、环境配置等。同时,要遵循格式要求,使用正确的LaTeX语法,并添加引用标识。 最后,确保回答结构清晰,分步骤解析课程内容,并结合引用材料中的信息,比如提到蓝桥云课的学习流程和环境集成,可能涉及ROS机器人或Arduino开发的具体步骤。需要避免猜测不确定的内容,而是基于现有引用合理推断,确保回答真实可靠。</think>### 蓝桥云课 3496 号课程内容解析 根据引用材料中的信息,蓝桥云课的课程通常采用**实验文档与实验环境融合**的设计模式[^1]。虽然具体课程编号3496的内容未明确说明,但结合蓝桥云课ROS相关课程的典型结构(如引用[2][3]),可推测其内容可能包含以下组成部分: #### 1. **课程目标** - 可能围绕ROS机器人开发或嵌入式系统(如Arduino)的核心技能展开 - 例如:"掌握ROS节点通信机制" 或 "实现Arduino与传感器数据交互" #### 2. **实验环境配置** - 预配置的云端开发环境(如引用[3]提到的Arduino环境) - 可能包含代码模板库和硬件模拟器 - 配置步骤可能涉及: ```bash sudo apt-get install ros-<version>-arduino-core ``` #### 3. **知识讲解** - 理论部分可能包含数学公式: $$ \tau = J \cdot \alpha + F_{friction} $$ 用于描述机器人关节力矩计算[^2] - ROS基础概念如话题(topic)、服务(service)、动作(action)的对比说明 #### 4. **分步实验任务** - 典型的实验流程可能包括: 1. 创建ROS工作空间 2. 编写Arduino控制程序 3. 实现传感器数据可视化 4. 调试与性能优化 #### 5. **扩展挑战** - 可能包含进阶任务如: - 多传感器数据融合 - 实时控制算法实现 - ROS与Web应用的集成开发
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值