Given an array and a value, remove all instances of that value in place and return the new length.
The order of elements can be changed. It doesn't matter what you leave beyond the new length.
#include<iostream>
using namespace std;
class Solution {
public:
/*法一:元素移动法:遇到指定元素时,len--;反之,若遇到的元素与
elem元素不等时,则向前移动该元素,来覆盖之前找到的elem,时间复杂度O(n),
空间复杂度O(1);
time: 6ms
*/
int removeElement(int A[], int n, int elem) {
if (n == 0)
return 0;
int len = n, pos = 0;
for (int i = 0, pos=0; i < n; i++)
{
if (A[i] == elem)
len--;
else
{
A[pos++] = A[i];
}
}
return len;
}
void swap(int& a, int& b)
{
int temp;
temp = a; a = b; b = temp;
}
int removeElement2(int A[], int n, int elem)
{
/* 基本思路是遍历数组一遍,当遇到一个满足条件的数时,将它与数组的最后的值交换。
当交换时当前遍历的位置与数组有效的位置相同时需要提前结束运算;否则继续遍历。
参考:http://blog.csdn.net/lanxu_yy/article/details/11689047
time: 5ms
*/
if (n == 0)
return 0;
int len = n;
int removeNum = 0;
for (int i = 0; i < n-removeNum; i++)
{
if (A[i] == elem)
{
swap(A[i], A[len - 1 - removeNum]);
removeNum++;
i--;
}
}
return len - removeNum;
}
};
void main()
{
int A[7] = { 1 };
int elem = 1;
int n = 1;
Solution s;
int len = s.removeElement(A, n, elem);
cout << len << endl;
for (int i = 0; i < len; i++)
cout << A[i]<<" ";
}
2015/08/31
void removeEle(int nums[], int n, int k)
{//移动元素法
int pos = 0;
for (int i = 0; i < n; ++i)
{
if (nums[i] != k)
nums[pos++] = nums[i];
}
cout << pos << endl;
for (int i = 0; i < pos; ++i)
cout << nums[i] << ",";
cout << endl;
}
void removeEle(int nums[], int n, int k)
{//头尾双指针交换法
int i = 0, j = n - 1;
int len = n;
while (i <= j)
{
if (nums[i] == k)
{
swap(nums[i], nums[j]);
j--;
len--;
}
else
{
++i;
}
}
cout << len << endl;
for (int i = 0; i < len; ++i)
cout << nums[i] << ",";
cout << endl;
}
void main()
{
int nums[] = { 7, 2, 7, 4, 5, 6, 7 };
int n = sizeof(nums) / sizeof(int);
int k = 7;
removeEle(nums, n, k);
}