牛客基础算法题,序列中整数去重
思路是用两个循环从第一个元素对比到最后一个元素,如果有相同的元素则进行向前位移一位元素的操作,然后总元素个数-1,直到没有相同的元素个数为止。
现在看来我这种写法时间复杂度太高了,但是我暂时没有其他更好的办法,如果有请在评论区告知,万分感谢
核心代码语句:
while (arr[i] == arr[j])
{//while的意义是防止移动元素后,还有多个相同元素的情况,如果有则继续进行位移
//例:1 2 2 2 3,位移一次后是1 2 2 3,此时还有相同元素,则继续进行位移
//直到1 2 3为止,此时arr[i]!=arr[j],则break跳出循环
for (int o = j; o < n; o++)
{//从后向前移动一个元素
arr[o] = arr[o + 1];
}
n--;//向前移动了一个元素(删除),则总元素-1
if (arr[i] != arr[j])
{//如果arr[i]!=arr[j],则退出while循环
break;
}
}
总代码:
#include<iostream>
using namespace std;
int main()
{
int arr[5005];
int n,i;
cin >> n;
for (int q = 0; q < n; q++)
{//输入
cin >> arr[q];
}
for (i = 0; i < n; i++)
{
for (int j = i + 1; j < n; j++)
{//从第一个开始对比第二个,如果相等则进入循环
while (arr[i] == arr[j])
{//while的意义是防止移动元素后,还有多个相同元素的情况,如果有则继续进行位移
//例:1 2 2 2 3,位移一次后是1 2 2 3,此时还有相同元素,则继续进行位移
//直到1 2 3为止,此时arr[i]!=arr[j],则break跳出循环
for (int o = j; o < n; o++)
{//从后向前移动一个元素
arr[o] = arr[o + 1];
}
n--;//向前移动了一个元素(删除),则总元素-1
if (arr[i] != arr[j])
{//如果arr[i]!=arr[j],则退出while循环
break;
}
}
}
cout << arr[i] << " ";
}
}