我正在嘗試從排序陣列中洗掉重復項。代碼為一個測驗用例提供正確的輸出,但未能為多個測驗用例提供正確的輸出。我使用其他方法獲得了正確的輸出,但這種方法有什么問題?我怎么解決這個問題?
#include <iostream>
#include<bits/stdc .h>
using namespace std;
int main() {
// your code goes here
int t;
cin>>t;
while(t--){
int n;
cin>>n;
int a[n],i,k,temp,count;
for(i=0;i<n;i ){
cin>>a[i];
}
sort(a,a n);
count=0;
for(i=0;i<n;i ){
if(a[i-1]-a[i]==0){
temp = a[i];
count ;
for(k=i;k<n;k ){
a[k] = a[k 1];
}
}
}
for(i=0;i<n-count;i ){
cout<<a[i]<<" ";
}
cout<<endl;
}
}
uj5u.com熱心網友回復:
像這樣的可變長度陣列
int a[n],i,k,temp,count;
不是標準的 C 功能。相反,您應該使用標準容器std::vector<int>。
這個 if 陳述句
if(a[i-1]-a[i]==0){
由于運算式 ,當i等于時呼叫未定義的行為。0a[i-1]
在這個 for 回圈中存在同樣的問題
for(k=i;k<n;k ){
a[k] = a[k 1];
}
由于運算式 ,whenk等于。n - 1a[k 1]
此外,每次找到這樣的元素時,復制找到的重復元素之后的所有元素也是低效的。
請注意std::unique,可以使用標準演算法代替回圈。
如果要使用 for 回圈,那么您可以實作如下所示的內容
#include <iostream>
int main()
{
int a[] = { 1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5 };
const size_t N = sizeof( a ) / sizeof( *a );
size_t n = 0;
for ( size_t i = 0; i < N; i )
{
if ( i == 0 || a[i] != a[n-1] )
{
if ( i != n ) a[n] = a[i];
n;
}
}
for ( size_t i = 0; i < n; i )
{
std::cout << a[i] << ' ';
}
std::cout << '\n';
return 0;
}
程式輸出是
1 2 3 4 5
如果使用標準演算法,std::unique那么解決方案會更簡單,因為無需撰寫自己的 for 回圈。
#include <iostream>
#include <iterator>
#include <algorithm>
int main()
{
int a[] = { 1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5 };
auto last = std::unique( std::begin( a ), std::end( a ) );
for ( auto first = std::begin( a ); first != last; first )
{
std::cout << *first << ' ';
}
std::cout << '\n';
return 0;
}
程式輸出與上圖相同,即
1 2 3 4 5
uj5u.com熱心網友回復:
我發現您的代碼有兩個主要問題,都是從陣列中越界讀取:
if(a[i-1]-a[i]==0)將在某一時刻被呼叫i==0,訪問元素a[-1]。
和這里:
for(k=i;k<n;k ){
a[k] = a[k 1];
}
在最后一次回圈迭代中,何時訪問k == n-1陣列元素a[n],這也是越界訪問。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/337806.html
下一篇:使用std::chrono::from_stream()決議時間格式“DD/MM/YYYYathh:mm:ss”和其他格式
