首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

一个比较有意思的题目,请求算法思路。该怎么解决

2012-01-28 
一个比较有意思的题目,请求算法思路。有一个数字数组,内容如下:2011834310201183431120118343122011834313

一个比较有意思的题目,请求算法思路。
有一个数字数组,内容如下:
2011834310
2011834311
2011834312
2011834313

希望通过一个函数计算后,输出如下的字符串:
2011834310-3
该字符串表明是一个连续的数字组合。

如果数字数组,不连续,而且跨越了进制,例如:
2011834310
2011834311
2011834312
2011834313
2011834318
2011834319
2011834320

那么应该输出如下的字符串:
2011834310-3   2011834318-20

请大家给出一些思路,谢谢。

[解决办法]
1 数组排序
2 循环比较, 记录跨越的次数生成存储结果的数组.
3 循环生成 结果数组.

[解决办法]
long[] input = new long[]{2011834310,
2011834311,
2011834312,
2011834313,
2011834318,
2011834319,
2011834320};
int mark = 0;
int current = 0;
while (current < input.Length)
{
mark = current;
current++;
while (current < input.Length && input[current] - input[current - 1] == 1)
{
current++;
}
Console.Write(input[mark] + "- ");
string str1 = input[mark].ToString();
string str2 = input[current - 1].ToString();
int index = 0;
while (str1[index] == str2[index])
{
index++;
}
Console.WriteLine(str2.Substring(index));
}
[解决办法]
排序,循环记录次数,格式化输出
[解决办法]
\\封装一下,并考虑位数差,做成这样
public class bas
{
private long startvalue, lastvalue;

public long Lastvalue
{
get { return lastvalue; }
}

public long Startvalue
{
get { return startvalue; }
}

public bas(long i)
{
startvalue = lastvalue = i;
}

private string calString()
{
StringBuilder sn1=new StringBuilder(startvalue.ToString()), sn2=new StringBuilder(lastvalue.ToString()),tmps=new StringBuilder();
if(sn2.Length> sn1.Length)
{
sn1.Insert(0, "0 ", sn2.Length - sn1.Length);
}

for (int index = 0; index < sn2.Length;index++ )
{
if (sn2[index] != sn1[index])
{
if (index > 0) tmps.Append(sn2.ToString(0, index ));
tmps.Append(sn1.ToString(index, sn1.Length - index));
tmps.Append( "- ");
tmps.Append(sn2.ToString(index, sn2.Length - index));
break;
}
}
if(tmps.Length!=0)return tmps.ToString();
else return sn1.ToString();
}

public string AddNew(long i)
{
if (i == lastvalue + 1) {
lastvalue = i;
return null; }
else
{
string ret = calString();
startvalue = lastvalue = i;
return ret;
}


}

public string endString
{
get { return calString(); }
}
}

class Test
{
public static void Main(string[] args)
{
long[] input = new long[]{9,10,12,13,14,15,89746343,2011834310,
2011834311,
2011834312,
2011834313,
2011834318,
2011834319,
2011834320,
2011834401,
2011834405,
2011834406,
2011834499,
2011834500,
2011834501};

bas b=new bas(input[0]);
for(int index=1;index <input.Length;index++)
{
string s = b.AddNew(input[index]);
if(s!=null&&s.Length> 0)Console.WriteLine(s);
}
Console.WriteLine(b.endString);
Console.ReadLine();
}
}

热点排行