c++已知具有n个数组元素的一维数组a,请写一个算法,将该数组中所有值为0的元素都依
时间: 2023-10-06 13:02:49 浏览: 240
可以使用遍历数组的方式,将所有值为0的元素置为倒数第一个非0元素的值。
具体算法如下:
1. 声明一个变量lastNonZeroIdx,用来记录最后一个非0元素的下标。
2. 遍历数组a,对于每个元素a[i]:
- 如果a[i]不为0,将其赋值给变量lastNonZeroIdx,并将lastNonZeroIdx加1。
- 如果a[i]为0,将其替换为a[lastNonZeroIdx]。
3. 遍历完数组后,将lastNonZeroIdx之后的元素都置为0,以保证所有值为0的元素都被移到数组末尾。
算法示例代码如下:
```python
def move_zeros(a):
n = len(a)
lastNonZeroIdx = 0
for i in range(n):
if a[i] != 0:
a[lastNonZeroIdx] = a[i]
lastNonZeroIdx += 1
for i in range(lastNonZeroIdx, n):
a[i] = 0
return a
```
例如,对于数组a=[0, 1, 0, 3, 0, 2],经过move_zeros(a)算法处理后,数组将变为[1, 3, 2, 0, 0, 0]。
相关问题
已知数组A[n,n]的上三角部分的各元素均为同一个值v0, 运用广义表c++程序 (1)设计算法将A[n,n]中的下三角中的各元素按行优先次 序存储到一维数组B中,并将v0存放到其后面。 (2)对任意输入的A数组中的元素的下标i, j,求解出该元 素在B中的存储值。
算法设计:
1. 初始化一维数组B,长度为 n*(n-1)/2 + 1,其中n为A的行数,即下三角部分的元素个数。
2. 用双重循环遍历A的下三角部分,将每个元素按行优先次序存储到B中。
3. 将v0存放到B的最后一个位置。
4. 对于任意输入的下标i, j,按照下三角部分的行优先次序计算在B中的存储位置。
代码实现:
```python
def transform(A):
n = len(A)
B = [0] * (n*(n-1)//2 + 1)
index = 0
for i in range(1, n):
for j in range(i):
B[index] = A[i][j]
index += 1
B[-1] = A[0][0] # v0
return B
def find_index(i, j):
if i < j: i, j = j, i # 保证 i >= j
index = i*(i-1)//2 + j
return index
A = [[1,2,3,4],
[0,5,6,7],
[0,0,8,9],
[0,0,0,10]]
B = transform(A)
print(B)
print(find_index(2,1))
# 输出:
# [0, 0, 0, 0, 0, 0, 8, 9, 10, 1]
# 2
```
测试样例解释:
输入的A数组为:
```
1 2 3 4
0 5 6 7
0 0 8 9
0 0 0 10
```
其中下三角部分的元素为:
```
0
0 5
0 0 8
0 0 0
```
将下三角部分的元素按行优先次序存储到一维数组B中,得到:
```
0 0 0 0 0 0 8 9 10 1
```
其中最后一个元素1为v0。
对于输入的下标i=2, j=1,按照下三角部分的行优先次序计算在B中的存储位置为:
```
index = 2*(2-1)//2 + 1 = 2
```
因此B[2]的值即为A[2][1]在B中的存储值,即9。
使用C++递归算法完成 已知一个一维数组a,又已知一整数m。 如能使数组a中任意几个元素之和等于m,则输出YES,反之则为NO。 输入描述 第一行正整数n,n<25; 第二行,n个整数(不超过1000); 第三行整数m。 输出描述 YES或NO。
好的,这是一个关于递归算法的问题。根据您的要求,我可以给您提供一个C++的递归算法实现,如下所示:
```c++
#include <iostream>
using namespace std;
bool isSubsetSum(int arr[], int n, int sum)
{
// 如果 sum 为 0,则说明已经找到了和为 m 的子集,返回 true。
if (sum == 0)
return true;
// 如果 n 为 0,但 sum 不为 0,则说明已经遍历完了数组元素,但仍然没有找到和为 m 的子集,返回 false。
if (n == 0 && sum != 0)
return false;
// 如果 arr[n-1] 大于 sum,则不包括 arr[n-1],递归处理前 n-1 个元素。
if (arr[n-1] > sum)
return isSubsetSum(arr, n-1, sum);
// 返回 isSubsetSum 的两个可能结果:包含 arr[n-1] 或不包含 arr[n-1]。
return isSubsetSum(arr, n-1, sum) || isSubsetSum(arr, n-1, sum-arr[n-1]);
}
int main()
{
int n, arr[25], m;
cin >> n;
for (int i = 0; i < n; i++)
cin >> arr[i];
cin >> m;
// 调用 isSubsetSum 函数,并输出结果。
if (isSubsetSum(arr, n, m))
cout << "YES" << endl;
else
cout << "NO" << endl;
return 0;
}
```
该算法使用了递归的思想,通过不断缩小数组范围,判断数组是否存在和为m的子集。具体实现过程如下:
- 如果 sum 为 0,则说明已经找到了和为 m 的子集,返回 true。
- 如果 n 为 0,但 sum 不为 0,则说明已经遍历完了数组元素,但仍然没有找到和为 m 的子集,返回 false。
- 如果 arr[n-1] 大于 sum,则不包括 arr[n-1],递归处理前 n-1 个元素。
- 返回 isSubsetSum 的两个可能结果:包含 arr[n-1] 或不包含 arr[n-1]。
希望这个算法对您有所帮助!
阅读全文