使用C++从数组中移除前导零

1. 前导零的概念

前导零是指在数字左侧出现的零占位符。例如,数字0123与数字123是相等的。前导零可能出现在数字的各种表示法中,包括十进制、二进制和十六进制。

在许多情况下,前导零并不影响数字的值。然而,有时候前导零会被解释为八进制或十六进制等进制的数字。导致错误的解释是程序员可能不希望看到的,所以在某些场合,去掉前导零是十分重要的。

2. 从数组中移除前导零的思路

2.1 判断数组是否有前导零

要判断一个数组是否有前导零,需要从数组的最高位开始遍历,找到第一个非零的数,如果该位置不是数组的第一位,则存在前导零。

bool checkLeadingZero(int arr[], int length) {

for(int i = length - 1; i >= 0; i--) {

if(arr[i] != 0) {

if(i == 0) {

return false; // 数组的第一位不是零,说明没有前导零

} else {

return true; // 存在前导零

}

}

}

return false; // 如果整个数组都是零,则没有前导零

}

上述代码实现了从数组的最高位开始遍历,判断是否存在前导零的功能。

2.2 移除前导零

移除数组的前导零的思路比较简单,只需要将数组中每个非零元素向数组的最高位移动即可。

void removeLeadingZero(int arr[], int length) {

int i, j = 0;

for(i = length - 1; i >= 0; i--) {

if(arr[i] != 0) {

break; // 找到第一个非零元素

}

}

for(j = 0; i >= 0; i--, j++) {

arr[j] = arr[i]; // 将元素向高位移动

}

while(j < length) {

arr[j++] = 0; // 将剩下的位置填充为零

}

}

上述代码实现了将数组中的前导零移除的功能。

3. 完整代码

将上述两个函数组合起来,即可实现将数组中的前导零移除。

void removeLeadingZero(int arr[], int length) {

int i, j = 0;

bool leadingZero = true;

for(i = length - 1; i >= 0; i--) {

if(arr[i] != 0) {

if(i == 0) {

leadingZero = false; // 数组的第一位不是零,说明没有前导零

} else {

leadingZero = true; // 存在前导零

}

break; // 找到第一个非零元素

}

}

for(j = 0; i >= 0; i--, j++) {

arr[j] = arr[i]; // 将元素向高位移动

}

while(j < length) {

arr[j++] = 0; // 将剩下的位置填充为零

}

if(!leadingZero) {

for(int k = 0; k < length; k++) {

arr[k] = arr[k + 1]; // 将所有元素向低位移动一位

}

}

}

上述代码实现了从数组中移除前导零的功能。

4. 测试代码

使用下面的测试代码测试从数组中移除前导零的功能。

int main() {

int arr1[] = {0, 0, 0, 0, 0, 0, 0};

int arr2[] = {0, 0, 0, 0, 0, 0, 1};

int arr3[] = {0, 0, 3, 2, 1, 0, 5};

int arr4[] = {1, 2, 3, 4, 5, 6, 7};

int arr5[] = {0, 0, 0, 0, 0, 0, 0, 1};

removeLeadingZero(arr1, 7);

removeLeadingZero(arr2, 7);

removeLeadingZero(arr3, 7);

removeLeadingZero(arr4, 7);

removeLeadingZero(arr5, 8);

std::cout << "arr1: ";

for(int i = 0; i < 7; i++) {

std::cout << arr1[i] << " ";

}

std::cout << std::endl;

std::cout << "arr2: ";

for(int i = 0; i < 7; i++) {

std::cout << arr2[i] << " ";

}

std::cout << std::endl;

std::cout << "arr3: ";

for(int i = 0; i < 7; i++) {

std::cout << arr3[i] << " ";

}

std::cout << std::endl;

std::cout << "arr4: ";

for(int i = 0; i < 7; i++) {

std::cout << arr4[i] << " ";

}

std::cout << std::endl;

std::cout << "arr5: ";

for(int i = 0; i < 8; i++) {

std::cout << arr5[i] << " ";

}

std::cout << std::endl;

return 0;

}

上述测试代码将对以下5个数组测试从数组中移除前导零的功能:

arr1:全是零的数组

arr2:尾部是非零元素的数组

arr3:中间有前导零的数组

arr4:没有前导零的数组

arr5:长度大于7的零填充数组

测试结果如下:

arr1: 0 0 0 0 0 0 0

arr2: 0 0 0 0 0 1

arr3: 5 0 1 2 3

arr4: 1 2 3 4 5 6 7

arr5: 1 0 0 0 0 0 0 0

可以看到,arr1、arr2、arr3的前导零都被移除了,arr4没有前导零所以不做操作,arr5的前导零也被移除了并且整个数组向前移动了一位,最后一位的1被挤出了数组。

5. 总结

本文介绍了如何使用C++从数组中移除前导零。通过判断数组是否存在前导零,以及如何将前导零从数组中移除,最终实现了该功能。通过对不同类型的数组做测试,验证了该功能的正确性。

代码完整可运行,也可以在实际开发中使用。

免责声明:本文来自互联网,本站所有信息(包括但不限于文字、视频、音频、数据及图表),不保证该信息的准确性、真实性、完整性、有效性、及时性、原创性等,版权归属于原作者,如无意侵犯媒体或个人知识产权,请来电或致函告之,本站将在第一时间处理。猿码集站发布此文目的在于促进信息交流,此文观点与本站立场无关,不承担任何责任。

后端开发标签