数组中包含若干个0,去掉0,且数组的顺序不变

本文介绍了一个实用的数组操作算法:将数组中的零元素移动到数组尾部,并保持非零元素原有的顺序不变。该算法通过一次遍历实现了原地处理,避免了额外的空间开销。文中还提供了一个示例程序,演示了如何使用此算法处理特定数组。
/*
	int A[nSize],其中隐藏着若干0,其余非0整数,写一个函数int Func(int* A,int nSize),
	使A把0移至后面,非0整数移至数组前面并保持有序(按原来顺序),返回值为原数据中第一个
	元素为0的下标。(尽可能不使用辅助空间且考虑效率及异常问题,注释规范且给出设计思路) 
*/

#include <stdio.h>
#include <stdlib.h>

#define ARRAYSIZE	18

int Func(int *Input, int nSize);

int main (int argc, char **argv)
{
	int ArrayInt[ARRAYSIZE] = {1,2,3,4,0,5,7,0,7,5,3,2,0,234,3,0,2,4};
	
	printf("数组的原始值为:\n");
	for (int i = 0; i < ARRAYSIZE; i++)
	{
		printf("%-4d", ArrayInt[i]);
	}
	printf("\n");

	printf("第一个不为0的下标:%d\n", Func(ArrayInt, ARRAYSIZE));
	printf("去掉0后的值:\n");
	for (int i = 0 ; i < ARRAYSIZE; i ++)
	{
		if (0 != ArrayInt[i])
		{
			printf("%-4d", ArrayInt[i]);
		}
	}
	printf("\n");

	system("pause");
	return 0;
}

int Func(int *Input, int nSize)
{
	bool FlagFirstZero = false;
	int FirstZeroIndex = 0;
	int CountZero = 0;

	for (int i = 0; i < nSize-1; i ++)
	{
		if (0 == Input[i] && !FlagFirstZero)
		{
			FirstZeroIndex = i;
			FlagFirstZero = true;
		}

		if (0 == Input[i] && 0 == Input[i+1])
		{
			CountZero++;
		}
		else if (0 == Input[i] && 0 != Input[i+1])
		{
			Input[i-CountZero] = Input[i+1];
			Input[i+1] = 0;
		}
	}

	return FirstZeroIndex;
}

# T210325 数字迷宫(不能用vector),我要c++代码 ## 题目描述 给定一个 $n \times m$ 的二维数组,行从上往下按 $1 \sim n$ 编号,列从左往右按 $1 \sim m$ 编号,每个格子上写着一个 $0 \sim 9$ 的数字 现在 Darko 将从第 $x$ 行第 $y$ 列的格子出发,每一步可以向上、下、左、右走一步到相邻的格子,可以重复经过之前走过的格子,但不能走出界,Darko 会把沿路经过的格子上的数字一一写下来形成一个数字字符串(包括起点的数字,重复经过格子时,每经过一次都会写下来一位) 如果 Darko 想让 `0123456789` 这个数字串是他写下来的数字串的一个子序列,即可以在写下的字符串中按从前到后的顺序(不一定连续)选出若干个字符,取出来正好形成 `0123456789` 这个字符串,那么他写下来的数字字符串至少要多长 数据保证在这个二维数组中 $0 \sim 9$ 都会出现 ## 输入格式 第一行,四个正整数 $n, m, x, y$,表示二维数组的大小和 Darko 的起点 接下来 $n$ 行,每行 $m$ 个整数 $a_i$ 表示二维数组中每个格子上的数字 ## 输出格式 输出一行,包含一个正整数,表示答案 ## 输入输出样例 #1 ### 输入 #1 ``` 2 5 1 1 0 1 2 3 4 5 6 7 8 9 ``` ### 输出 #1 ``` 14 ``` ## 输入输出样例 #2 ### 输入 #2 ``` 2 5 1 1 0 1 2 3 4 9 8 7 6 5 ``` ### 输出 #2 ``` 10 ``` ## 输入输出样例 #3 ### 输入 #3 ``` 2 5 1 2 0 1 2 3 4 9 8 7 6 5 ``` ### 输出 #3 ``` 11 ``` ## 说明/提示 对于 $60\%$ 的数据,$1 \leq n, m \leq 50$ 对于 $100\%$ 的数据,$1 \leq n, m \leq 1000, 0 \leq a_i \leq 9$ 数据保证在这个二维数组中 $0 \sim 9$ 都会出现
05-14
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值