如何简单输出有序数组的重复区间?

Harrell 2011-10-23 02:28:02
有一个有序一维数组 a[]={1,1,1,2,3,3,3,4,5,6,6}
如何才能输出"重复元素:重复开始-结束"这种格式?
例如上面的应该输出为:
1:0-2
3:4-6
6:9-10
我有一个代码, 但是效率很不理想
...全文
122 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Harrell 2011-10-23
  • 打赏
  • 举报
回复
结构体列表!!! 初学C#,学艺不精, 没有这么好的想法, 多谢指教了
matrixcl 2011-10-23
  • 打赏
  • 举报
回复
还差一点,最后的也要去掉 len>1的判断
来个完整的吧

using System;
using System.IO;
using System.Collections.Generic;

class Program
{
static void Main()
{
int[] arr = new int[]{1,1,1,2,3,3,3,4,5,6,6};

List<MyTag> lst = new List<MyTag>();

MyTag tag = new MyTag() { data = arr[0], len = 1, pos = 0 };
for (int i = 1; i < arr.Length; i++)
{
if (tag.data == arr[i])
{
tag.len++;
}
else
{
//if (tag.len > 1)
//{
lst.Add(tag);
//}

tag.data = arr[i];
tag.len = 1;
tag.pos = i;
}
}

//if (tag.len > 1)
//{
lst.Add(tag);
//}

foreach (var v in lst)
{
Console.WriteLine("{0}:{1}-{2}", v.data, v.pos, v.pos + v.len - 1);
}


}

}

struct MyTag
{
public int data;
public int pos;
public int len;
}
matrixcl 2011-10-23
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 haorui658 的回复:]

我是遍历数组元素, 当数组改变的时候就认为一个区间结束了另一个区间开始,但是最后一个区间6,6的时候由于之后没有元素改变, 就需要在循环外还要加一个判断输出致使代码很乱

更新一下, 应该输出为:
1:0-2
2:3-3
3:4-6
4:7-7
5:8-8
6:9-10
[/Quote]

更新一下

for (int i = 1; i < arr.Length; i++)
{
if (tag.data == arr[i])
{
tag.len++;
}
else
{
//if (tag.len > 1)
//{
lst.Add(tag);
//}

tag.data = arr[i];
tag.len = 1;
tag.pos = i;
}
}
matrixcl 2011-10-23
  • 打赏
  • 举报
回复

using System;
using System.IO;
using System.Collections.Generic;

class Program
{
static void Main()
{
int[] arr = new int[]{1,1,1,2,3,3,3,4,5,6,6};

List<MyTag> lst = new List<MyTag>();

MyTag tag = new MyTag() { data = arr[0], len = 1, pos = 0 };
for (int i = 1; i < arr.Length; i++)
{
if (tag.data == arr[i])
{
tag.len++;
}
else
{
if (tag.len > 1)
{
lst.Add(tag);
}

tag.data = arr[i];
tag.len = 1;
tag.pos = i;
}
}

if (tag.len > 1)
{
lst.Add(tag);
}

foreach (var v in lst)
{
Console.WriteLine("{0}:{1}-{2}", v.data, v.pos, v.pos + v.len - 1);
}


}


}

struct MyTag
{
public int data;
public int pos;
public int len;
}
Harrell 2011-10-23
  • 打赏
  • 举报
回复
我是遍历数组元素, 当数组改变的时候就认为一个区间结束了另一个区间开始,但是最后一个区间6,6的时候由于之后没有元素改变, 就需要在循环外还要加一个判断输出致使代码很乱

更新一下, 应该输出为:
1:0-2
2:3-3
3:4-6
4:7-7
5:8-8
6:9-10
matrixcl 2011-10-23
  • 打赏
  • 举报
回复
遍历一遍就可以,O(n).
你怎么实现的?

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧