首页 > 试题广场 >

数组元素处理

[编程题]数组元素处理
  • 热度指数:12915 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
有一个数组 int arr[n],要求写一个函数:void func(int *p, int n);将数组 arr 中为 0 的元素都移至数组末尾,将非 0 的元素移至开始(保持原来的顺序不变)。
例如:
数组中元素原来是:1 0 3 4 0 -3 5
经过 func 处理后:1 3 4 -3 5 0 0

输入描述:
键盘输入 6 个整数,保存到数组中


输出描述:
经过 func 处理后数组的元素,元素和元素之间使用空格隔开
例如:1 3 4 -3 5 0 0
示例1

输入

1
0
3
4
0
-3

输出

1 3 4 -3 0 0
#include <iostream>
using namespace std;

void func(int* p,int n)
{
    for (int i = 0;i < n;i++)
    {
        if (p[i] == 0)
        {
            for (int j = i + 1;j < n;j++)
            {
                swap(p[j - 1],p[j]);
            }
        }   
    }
}
int main(){
    int* pmc = new int[6];
    for (int j = 0;j < 6;j++)
        cin >> pmc[j];
    func(pmc, 6);
    for (int i = 0;i < 6;i++)
        cout << pmc[i] << " ";
    delete []pmc;
    return 0;
}
发表于 2022-05-17 22:21:41 回复(0)
void func(int* p, int n) {

    // write your code here......
    int a = 0; // 指针增量
    for(int i = 0; i < n; i++){
        if(*(p + i) != 0){
            *(p + a) = *(p + i);
            a++;
        }
    }
    // 末尾补0
    for(int i = a; i < n; i++){
        *(p + i) = 0;
    }
    
}

发表于 2022-08-26 15:15:17 回复(0)
void func(int* p, int n)
{
    int k = 0;
    for(int i = 0;i < n;i++)
        if(p[i] != 0)
            p[k++] = p[i];
    for(int i = k;i < n;i++)
        p[i] = 0;
}

发表于 2022-08-13 08:42:34 回复(0)
#include <iostream>
using namespace std;

void func(int* p, int n);

int main() {

    int arr[6] = { 0 };
    for (int i = 0; i < 6; i++) {
        cin >> arr[i];
    }

    func(arr, 6);

    for (int i = 0; i < 6; i++) {
        if (i == 5) {
            cout << arr[i] << endl;
        }
        else {
            cout << arr[i] << " ";
        }
    }

    return 0;
}

void func(int* p, int n) {

    // write your code here......
    // p, q 分别为头尾指针
    int* q = p + n - 1;
    while(p < q) {
        if(*p != 0)
            p++;
        else {
            // p + 1 至 q 的元素向前移
            for(int* r = p; r < q; r++)
                *r = *(r + 1);
            *q = 0;
            // 尾指针右移
            q--;
        }
    }

}

发表于 2022-06-25 16:45:48 回复(1)
思路:逐个语素遍历,发现等于零的元素则把它沉到数组末尾,其他逐个提前,这里借助一个辅助函数downFirst(),它把一个数组的首元素扔至尾部,其余逐个往前放一个位置,代码如下
#include <iostream>
using namespace std;

void func(int* p, int n);

int main() {

    int arr[6] = { 0 };
    for (int i = 0; i < 6; i++) {
        cin >> arr[i];
    }

    func(arr, 6);

    for (int i = 0; i < 6; i++) {
        if (i == 5) {
            cout << arr[i] << endl;
        }
        else {
            cout << arr[i] << " ";
        }
    }

    return 0;
}
//辅助函数downFirst(),它把一个数组的首元素扔至尾部,其余逐个往前放一个位置
void downFirst(int a[],int n){
    int temp=a[0];
    for(int i=0;i<n-1;i++){
        a[i]=a[i+1];
    }
    a[n-1]=temp;
}
//逐个语素遍历,发现等于零的元素则把它沉到数组末尾,其他逐个提前
void func(int* p, int n) {
    for(int i=0;i<n;i++){
        if(p[i]==0)
            downFirst(p+i,n-i);
    }
}

发表于 2021-12-01 19:29:47 回复(0)

#include <iostream>
#include <type_traits>
using namespace std;

void func(int* p, int n);

int main() {

    int arr[6] = { 0 };
    for (int i = 0; i < 6; i++) {
        cin >> arr[i];
    }

    func(arr, 6);

    for (int i = 0; i < 6; i++) {
        if (i == 5) {
            cout << arr[i] << endl;
        } else {
            cout << arr[i] << " ";
        }
    }

    return 0;
}

void func(int* p, int n) {

    // write your code here......
    int* slow = p;
    int* pend = p + n;
    while (p < pend) {
        if (*p != 0) {
            std::swap(*slow, *p);
            ++slow;
        }
        ++p;
    }


}


编辑于 2023-12-26 12:27:13 回复(0)
#include<iostream>
using namespace std;

void func(int* p, int n);
int main()
{
    int arr[6] = { 0 };
    for (int i = 0;i < 6;i++)
    {
        cin >> arr[i];
    }
    func(arr, 6);
    for (int i = 0;i < 6;i++)
    {
        cout << arr[i] << " ";
    }
    system("pause");
}
void func(int* p, int n)
{
    int i = 0;
    while (i < n)
    {
        for (int i = 0;i < n;i++)
        {
            if (p[i] == 0)
            {
                for (int j = i;j < n - 1;j++)
                {
                    p[j] = p[j + 1];
                }
                p[n - 1] = 0;
                break;
            }
        }
        i++;
    }

}
发表于 2023-08-19 14:44:39 回复(0)
void func(int* p, int n) {

    // write your code here......
    int i = 0, j = 0;
    for (; i < n; i++) {
        if (p[i] != 0) {
            p[j++] = p[i];
        }
    }
    for (;j < n; j++) {
        p[j] = 0;
    }

}

发表于 2022-03-01 15:46:38 回复(0)
#include <bits/stdc++.h>
#include <iostream>
using namespace std;

void func(int* p, int n);

int main() {

    int arr[6] = { 0 };
    for (int i = 0; i < 6; i++) {
        cin >> arr[i];
    }

    func(arr, 6);

    for (int i = 0; i < 6; i++) {
        if (i == 5) {
            cout << arr[i] << endl;
        }
        else {
            cout << arr[i] << " ";
        }
    }

    return 0;
}

void func(int* p, int n) {

    // write your code here......
    int arr[6],cnt = 0;
    for(int i = 0; i < n; i++){
        if(*(p+i) != 0){
            *(arr + cnt) = *(p+i);
            cnt ++;
        }
    }
    while(cnt < n){
        *(arr + cnt) = 0;
        cnt ++;
    }
    for(int i = 0; i < n; i++){
        *(p+i) = *(arr+i);
    }
}

发表于 2022-01-13 17:04:00 回复(2)
#include <iostream>
using namespace std;

void func(int* p, int n);

int main() {

    int arr[6] = { 0 };
    for (int i = 0; i < 6; i++) {
        cin >> arr[i];
    }

    func(arr, 6);

    for (int i = 0; i < 6; i++) {
        if (i == 5) {
            cout << arr[i] << endl;
        }
        else {
            cout << arr[i] << " ";
        }
    }

    return 0;
}

void func(int* p, int n) {

    // write your code here......
    int b[6];
    int g=0;
    for(int i=0;i<6;i++){
        if(p[i]!=0){ 
            b[i-g]=p[i];
        }
        if(p[i]==0){
            g++;
            b[6-g]=0;
        }
    }
    for(int i=0;i<6;i++){
        p[i]=b[i];
    }
}

发表于 2024-03-09 15:56:00 回复(0)
#include <iostream>
using namespace std;

void func(int* p, int n);

int main() {

    int arr[6] = { 0 };
    for (int i = 0; i < 6; i++) {
        cin >> arr[i];
    }

    func(arr, 6);

    for (int i = 0; i < 6; i++) {
        if (i == 5) {
            cout << arr[i] << endl;
        }
        else {
            cout << arr[i] << " ";
        }
    }

    return 0;
}

void func(int* p, int n) {
    // write your code here......
    int slow=0;int fast=0;
    for(;fast<n;fast++)
    {
        if(*(fast+p)!=0)
        {
            p[slow]=p[fast];
            slow++;
        }
    }
    for(;slow<n;slow++)
    {
        p[slow]=0;
    }
}

编辑于 2024-02-05 21:33:34 回复(1)
先用数组Arr存储更改后的数组,最后再赋值回去

#include <iostream>
using namespace std;

void func(int* p, int n);

int main() {

    int arr[6] = { 0 };
    for (int i = 0; i < 6; i++) {
        cin >> arr[i];
    }

    func(arr, 6);

    for (int i = 0; i < 6; i++) {
        if (i == 5) {
            cout << arr[i] << endl;
        }
        else {
            cout << arr[i] << " ";
        }
    }

    return 0;
}

void func(int* p, int n) {
    // write your code here......
    int count = 0;
    int Arr[n];
    int i = 0,j = 0;
    for(i = 0; i < n; ++i){
        if(p[i]==0){
            count++;
        }else{
            Arr[j++] = p[i]; 
        }
    }
    for(j = n-count; j < n; ++j){
        Arr[j] = 0;
    }
    for(i = 0; i < n; ++i){
        p[i] = Arr[i];
    }
}


发表于 2024-02-02 21:01:14 回复(0)
我的思路是用一些空间去存储非零值,因为这个数组无论如何都是要遍历一遍的,考虑到函数执行完局部变量就消亡了,所以不如再遍历一遍,从一个数组copy到另一个就好了。

第一遍遍历后将原数组非零值变为零,主要是因为第二遍copy里用的是临时数据的终止条件。
void func(int* p, int n) {

    // write your code here......
     int vec[6] = { 0 };
    for (int i = 0, j = 0; i < n; i++) {
        if (*(p + i) == 0) {
            continue;
        }
        vec[j++] = *(p + i);
        *(p + i) = 0;
    }

    for (int i = 0, j = 0; i <n; i++) {
        if (vec[j] == 0) {
            break;
        }
        *(p + i) = vec[j++];
    }
}
发表于 2023-11-14 20:50:25 回复(0)
#include <iostream>
using namespace std;

void func(int* p, int n);

int main() {
    int arr[6] = { 0 };
    for (int i = 0; i < 6; i++) {
        cin >> arr[i];
    }
    func(arr, 6);

    for (int i = 0; i < 6; i++) {
        if (i == 5) {
            cout << arr[i] << endl;
        }
        else {
            cout << arr[i] << " ";
        }
    }
    return 0;
}

void func(int* p, int n) {
    // write your code here......
    int j = 0;
    for(int i=0;i<=6;i++){
        for(j=i;j<=6;j++){
        if(p[j] == 0){
            swap(p[j],p[j+1]);
        }
        }
    }
    
    
}

直接遍历数组,交换0和后一个数的次序……
发表于 2023-08-28 09:45:55 回复(0)
void func(int* p, int n) {
    int num = 0;//前面有几个0,表示数字往前提几位
    for(int i = 0;i<n;i++){(p[i]!=0)?p[i-num] = p[i]:num++;}
    for(int k = n-num;k<n+1;k++){p[k] = 0;}
}
发表于 2023-07-20 16:39:21 回复(0)
#include <iostream>
using namespace std;

void func(int* p, int n);

int main() {

    int *arr = new int[6];
    for (int i = 0; i < 6; i++) {
        cin >> arr[i];
    }

    func(arr, 6);

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

void func(int* p, int n) {

    // write your code here......
    for(int i = 0;i<n - 1; i++)   //冒泡升序  确定轮数
    {
        for(int j = 0;j<n-i-1;j++)  //确定每轮中比较的次数
        {
            if(p[j]==0)
            {
                int temp = p[j];
                p[j] = p[j+1];
                p[j+1] = temp;
            }
        }
    }

}

发表于 2023-06-30 16:46:35 回复(0)
常规思路:
void func(int* p, int n) {

    // write your code here......
    int k=0;
    for(int i=0,j=0;i<n;i++)
        if(p[i]!=0) p[j++]=p[i];
        else ++k;
    for(int i=n-k;i<n;i++)
        p[i]=0;
}
发表于 2023-05-24 22:46:07 回复(0)
#include <any>
#include <iostream>
using namespace std;

void func(int* p, int n) ;

int main() {
    int arr[6] = { 0 };
    for (int i = 0; i < 6; i++) {
        cin >> arr[i];
    }
    func(arr, 6);

    for (int i = 0; i < 6; i++) {
        if (i == 5) {
            cout << arr[i] << endl;
        } else {
            cout << arr[i] << " ";
        }
    }
    return 0;
}

void func(int* p, int n) {

    // write your code here......
    for (int i = 0; i < n; i++) {
        if (p[i] == 0) {
            for(int j =i;j<n;j++)
            {
                p[j] =p[j+1];
            }
            p[n-1] =0;
        }
    }
}

发表于 2023-05-19 15:56:12 回复(0)
#include<iostream>
using namespace std;
#include <vector>
#include <algorithm>
void myPrint(int val)
{
    cout << val << " ";
}
void test01()
{
    int n;
    vector<int> v, vTarget;
    for (int i = 0; i < 6; i++)
    {
        cin >> n;
        v.push_back(n);
    }
    vTarget.resize(v.size());
    int t = 0;
    for (int j = 0; j < 6; j++)
    {
        if (v[j] != 0)
            vTarget[t++] = v[j];
    }
    for (int k = t; k < 6; k++)
        vTarget[k] = 0;
    
    for_each(vTarget.begin(), vTarget.end(), myPrint);
}
int main()
{
    test01();
    return 0;
}
发表于 2023-02-05 00:00:40 回复(0)
#include <iostream>
using namespace std;

void func(int* p, int n) {
    /*j记录末尾元素0要存放的位置*/
    int j = n - 1;
    for (int i = 0; i < n; i++) {
        if (p[i] == 0) {
            for (int k = i; k < j; k++) {
                p[k] = p[k + 1];
            }
            /*存放0*/
            p[j] = 0;
            /*下一个要存放0的位置前移*/
            j--;
            /*因为末尾有存放0的情况,所以已经存放0的部分不再判断,n需要变化*/
            n = j + 1;
        }
    }
}

int main() {
    int arr[100];
    int i = 0;
    int n;
    while (cin >> n) {
        arr[i] = n;
        i++;
    }
    func(arr, i);
    for (int j = 0; j < i; j++) {
        cout << arr[j] << " ";
    }
}
// 64 位输出请用 printf("%lld")

发表于 2022-12-14 10:38:57 回复(0)