如果5
小于element[i]
需要移动3
代替element[i+1]
,我会使用element[i]
项来说明数据}。
int array[5] = {4, 2, 3, 5, 1};
int number = 3;
for (int i = 0; i < number; i++)
{
if (array[i] > number)
{
for (int j = 0; j < i - 1; j++)
{
array[j] = array[j + 1];
}
number = number - 1;
}
}
预期结果为array = {2, 3, 1, anyNumber, anyNumber};
答案 0 :(得分:1)
上述问题的O(n)工作代码..但正如其他人在评论中指出的那样..你最终得到一个使用较少空间然后分配给它的数组..
#include<stdio.h>
int main()
{
int arr[] = {4, 2, 3, 5, 1};
int* temp1 = arr;
int* temp2 = arr;
int i, n1 = 5, n2 = 5;
for(i = 0; i < n1; i++)
{
if(*temp2 >= 3)
{
*temp1 = *temp2;
temp1++;
temp2++;
}
else
{
n2--; //the number of elements left in the array is denoted by n2
temp2++;
}
}
}
答案 1 :(得分:1)
嵌套循环为您提供O( n 2 )复杂性和非显而易见的代码。
更好地使用std::remove_if
:
int array[5] = {4, 2, 3, 5, 1};
int number = 3;
remove_if( begin( array ), end( array ), [=]( int x ) { return x>number; } );
免责声明:编码器未触及代码。
答案 2 :(得分:0)
试试这段代码。你不应该减少每一步的数量。此外,第二个循环应该从i开始并在数组的末尾停止:
int array[5] = {4, 2, 3, 5, 1};
int number = 3;
for (int i = 0; i < number; i++)
{
if (array[i] > number)
{
for (int j = i; j < 5; j++)
{
array[j] = array[j + 1];
}
}
}
答案 3 :(得分:0)
这是一个更紧凑和惯用的方式(无论如何我都是这样看)从数组中删除项目的方法:
#include <iostream>
#include <algorithm>
#include <iterator>
int main()
{
int array[] = {4, 2, 3, 5, 1};
int* begin = array;
int* end = begin + sizeof(array)/sizeof(array[0]);
int number = 3;
end = std::remove_if(begin, end, [&number](int v) {return v > number;});
std::copy(begin, end, std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
return 0;
}
仅供比较,这是使用std::vector
的版本:
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
int main()
{
std::vector<int> array = {4, 2, 3, 5, 1};
int number = 3;
auto end = std::remove_if(array.begin(), array.end(), [&number](int v) {return v > number;});
std::copy(array.begin(), end, std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
return 0;
}
答案 4 :(得分:0)
作为替代方案,如果你想保留你的物品,但是表示将来会发生什么,“删除”,可以使用的算法是stable_partition
:
#include <algorithm>
#include <iostream>
#include <iterator>
#include <functional>
int main()
{
int vValues[] = {4,2,3,5,1};
// partition the values on left and right. The left side will have values
// <= 3, and on right >3. The return value is the partition point.
int *p = std::stable_partition(vValues, vValues + 5,
std::bind2nd(std::less_equal<int>(), 3));
// display information
std::cout << "Partition is located at vValues[" << std::distance(vValues, p) << "]\n";
std::copy(vValues, vValues + 5, std::ostream_iterator<int>(std::cout, " "));
}
输出:
Partition is located at vValues[3]
2 3 1 4 5
您将看到2,3,1位于分区p
的左侧,而4,5位于分区p
的右侧。因此,“已删除”项目从p
指向的位置开始。 std::partition
确保元素在完成后仍处于相对顺序。
答案 5 :(得分:0)
我创建了自己的例子,希望这可以帮助人们作为参考:
html