采用的是bit-map算法,关于什么是bit-map,百度一下;
直接上一段代码,用C#改写的!
如下:
class Program
{
private static int[] flags = new int[1000000];
private static DateTime starttime = new DateTime();
private static int get_val( int idx)
{
int i = idx/4;
int j = idx%4;
int ret = (flags[i]&(0x3<<(2*j)))>>(2*j);
return ret;
}
private static int set_val(int idx,int val)
{
int i = idx / 4;
int j = idx % 4;
int tmp = (flags[i] & ~((0x3 << (2 * j)) & 0xff)) | (((val % 4) << (2 * j)) & 0xff);
flags[i] = tmp;
return 0;
}
private static int add_one(int idx)
{
if (get_val(idx) >=2 )
{
return 1;
}
else
{
set_val(idx,get_val(idx)+1);
return 0;
}
}
static void Main(string[] args)
{
int[] value={10,5,392,49,24,0,95,20,9098,20340,900934,290390,5,95,20340,29039,5};
Console.WriteLine("原数组!");
foreach (int item in value)
{
Console.Write(item+" ");
add_one(item);
}
Console.WriteLine("\n\n只出现过一次的数是:");
starttime = DateTime.Now;
for (int i = 0; i < 1000000; ++i)
{
if (get_val(i)==1)
{
Console.WriteLine(i);
}
}
string processTimet = ExecDateDiff(starttime, DateTime.Now);
Console.WriteLine("共用时{0}",processTimet);
Console.Read();
}
/// <summary>
/// 计算两个时间之间的差值。
/// </summary>
/// <param name="dateBegin"></param>
/// <param name="dateEnd"></param>
/// <returns></returns>
public static string ExecDateDiff(DateTime dateBegin, DateTime dateEnd)
{
TimeSpan ts1 = new TimeSpan(dateBegin.Ticks);
TimeSpan ts2 = new TimeSpan(dateEnd.Ticks);
TimeSpan ts3 = ts1.Subtract(ts2).Duration();
//你想转的格式
return ts3.TotalMilliseconds.ToString() + "毫秒";
}
}
运行结果如下: