C++ “如何分组”;不同于;迭代数组时的元素(例如:{1,2,2,1,3,3,3,2,1,1}到{1,2}{2,1,3}{3}{3,2,1}{1})?
我有一个数组C++ “如何分组”;不同于;迭代数组时的元素(例如:{1,2,2,1,3,3,3,2,1,1}到{1,2}{2,1,3}{3}{3,2,1}{1})?,c++,arrays,algorithm,for-loop,iterator,C++,Arrays,Algorithm,For Loop,Iterator,我有一个数组 int a[]={1,2,2,1,3,3,3,2,1,1}; 例如,如果我想在迭代时对相同的元素进行分组(不需要任何临时变量或数组来存储或复制元素),则在迭代时在一行中打印相同的元素: 1 2 2 1 3 3 3 2 1 1 我可以使用for循环,如果条件如下: #include <stdio.h> int main(){ int a[]={1,2,2,1,3,3,3,2,1,1}; for(int i=0,j=0;i<sizeof
int a[]={1,2,2,1,3,3,3,2,1,1};
例如,如果我想在迭代时对相同的元素进行分组(不需要任何临时变量或数组来存储或复制元素),则在迭代时在一行中打印相同的元素:
1
2 2
1
3 3 3
2
1 1
我可以使用for循环,如果条件如下:
#include <stdio.h>
int main(){
int a[]={1,2,2,1,3,3,3,2,1,1};
for(int i=0,j=0;i<sizeof(a)/sizeof(int);i++){
if(i==sizeof(a)/sizeof(int)-1 || a[i]!=a[i+1]){
for(;j<=i;j++){
printf("%d ",a[j]);
}
printf("\n");
}
}
return 0;
}
是否可能有类似于以前版本的解决方案
for(int i=0,j=0;i<sizeof(a)/sizeof(int);i++){
if(...){
for(;j<=i;j++){
printf("%d ",a[j]);
}
printf("\n");
}
}
for(inti=0,j=0;iinta[]={1,2,2,1,3,3,2,1,1};
int-prev=a[0];
bool first=false;
printf(“%d”,上一页);
对于(int i=1;i
在数组的一次迭代中,无需使用任何临时变量即可轻松解决问题
其主要思想是在打印当前索引处的元素之前先查看后面的内容,如果它们都匹配,那么我们必须将当前索引处的元素放在新行上,就是这样
打印第一个元素,循环从第二个元素开始,因为第一个元素后面没有元素
使用这一基本思想,代码如下:
int a[] = {1,2,2,1,3,3,3,2,1,1};
//print the first element
printf("%d ",a[0]);
for (int i=1; i < sizeof(a) / sizeof(int); ++i) {
//check if the element at current index matches previous element.
if(a[i] == a[i-1])
printf("\n%d ",arr[i]);
else printf("%d ",arr[i]);
}
inta[]={1,2,2,1,3,3,2,1,1};
//打印第一个元素
printf(“%d”,a[0]);
对于(int i=1;i
这只是一个乞求解决的问题
对于不同元素的分组,您可以执行以下操作:
auto i = cbegin(a);
for (auto j = adjacent_find(cbegin(a), cend(a)); j != cend(a); i = j, j = adjacent_find(i, cend(a))) {
copy(i, ++j, ostream_iterator<decltype(*cbegin(a))>(cout, " "));
cout << endl;
}
copy(i, cend(a), ostream_iterator<decltype(*cbegin(a))>(cout, " "));
注:decltype(*cbegin(a))
可能看起来有点复杂,它可以用int
替换,但是,您将失去灵活性。如果您任意地想将a
声明为字符串,甚至是集
解决此问题所做的任何事情都具有时间复杂性O(N^2),则此代码不需要更改。但是可以用时间复杂度O(N)来解决这个问题,这在前面的答案中解释得很好。但是我认为您只需要通过更改if(…)
来解决这个问题。我在这里找到了一个解决方案。用以下代码替换该行
if( (i<sizeof(a)/sizeof(int) && a[i]==a[i+1]) || i==sizeof(a)/sizeof(int)-1 )
if((如果一个元素与下一个元素相同,请打印一个'\n'
。最后要小心。(或者反过来,检查它是否与前一个相同,并在开始时小心)@如果您不想使用任何临时变量,请参见我的解决方案。@ TimeGeeleSeEn<代码> int第一个/C++ >:我宁愿在C++中使用<代码> BoOL <代码>。@ MeleBiUS基于使用<代码> Prtff<代码>,而不是单个代码> STD::/Cord>。,但OP对我来说很有趣,所以我尝试了一个答案。我几乎喜欢这样,只是它总是在每行上打印一个额外的空格(不是世界末日)。@TimBiegeleisen尝试将第一个格式说明符更改为%d“
,将循环中的其他格式说明符更改为”\n%d“
和%d”
,或者使用cout
auto i = cbegin(a);
for (auto j = adjacent_find(cbegin(a), cend(a)); j != cend(a); i = j, j = adjacent_find(i, cend(a))) {
copy(i, ++j, ostream_iterator<decltype(*cbegin(a))>(cout, " "));
cout << endl;
}
copy(i, cend(a), ostream_iterator<decltype(*cbegin(a))>(cout, " "));
auto i = cbegin(a);
for (auto j = adjacent_find(cbegin(a), cend(a), not_equal_to<decltype(*cbegin(a))>()); j != cend(a); i = j, j = adjacent_find(i, cend(a), not_equal_to<decltype(*cbegin(a))>())) {
copy(i, ++j, ostream_iterator<decltype(*cbegin(a))>(cout, " "));
cout << endl;
}
copy(i, cend(a), ostream_iterator<decltype(*cbegin(a))>(cout, " "));
if( (i<sizeof(a)/sizeof(int) && a[i]==a[i+1]) || i==sizeof(a)/sizeof(int)-1 )