作者:手机用户2502905381 | 来源:互联网 | 2023-02-01 17:31
已存在的整数放在一表中 ,要求得到N个与之不重复且最小的整数 。可能大家不明白,举个例子
N = 5 的情况下(可变)
1. 如果表中已存在 1 , 2 , 3 , 4 , 5 , 100
那么应得到 6 , 7 , 8 , 9, 10 ;
2 . 如果表中已存在 1 , 3 , 4 , 5 , 6
那么应得到 2 , 7 , 8 , 9 , 10
数据库不支持存储过程 ,所以只能在程序中完成 .
22 个解决方案
int[] ss = new int[] { 1, 2, 3, 4, 5, 100 };
List sl = new List();
int i = 0;
int j = 1;
while(i < 5) // 5表示要找个数
{
for (int n = 0; n < ss.Length; n++)
{
if (j != ss[n])
{
i++;
sl.Add(ss[n]);
}
}
}
先放在ArrayList里排序一下,然后相邻的两个元素相减,如果大于1则说明存在与之不同的最小整数,就可以得到了,在和原先设定的N判断一下应该就可以得到指定数目的最小整数了
先排号序,将序号与数比较,不相等则表示存在空位,将空位填上继续比较。
不对
int[] ss = new int[] { 1, 2, 3, 4, 5, 100 };
List sl = new List();
int i = 0;
int j = 1;
bool same;
while(i < 5) // 5表示要找个数
{
same = false;
for (int n = 0; n < ss.Length; n++)
{
if (j == ss[n])
{
same = true;
}
if (true == same)
break;
}
if (false == same)
{
i++;
sl.add(j);
}
j++;
}
也没测试
int[] ss = new int[] { 1, 2, 3, 4, 5, 100 };
List sl = new List();
int i = 0;
int j = 1;
while(i < 5) // 5表示要找个数
{
for (int n = 0; n < ss.Length; n++)
{
if (j != ss[n])
{
sl.Add(j);
j++;
i++;
}
else
{
j++;
n++;
}
}
}
先判断第一个数(设为a)是否为1
否 则:1----a-1为N的前a-1个数
然后判断第1个和第2个数之间。。。。。。。。。
或者闹2个数组
一个放自然数1,2,3。。。
另外放已经排序好的题中数组;
然后比较。。。答案即出。。
int[] ss = new int[] { 1, 2, 3, 4, 5, 100 };
List sl = new List();
int i = 0;
int j = 1;
int n = 0;
int m;
while(i < 5) // 5表示要找个数
{
if (j != ss[n])
{
sl.Add(j);
j++;
i++;
}
else
{
j++;
n++;
}
if ( n == ss.Length )
{
for ( m = i;m < 5;m++)
{
sl.Add(j);
}
}
}
int[] ss = new int[] { 1, 2, 3, 4, 5, 100 };
List sl = new List();
int i = 0;
int j = 1;
int n = 0;
int m;
while(i < 5) // 5表示要找个数
{
if (j != ss[n])//从1开始与该段数字第一比较,前提是以升序排好序的
{//如果不相同
sl.Add(j);//加入J
j++;//J使用一次后自增
i++;//加入一次后自增
}
else
{//如果相同
j++;//J增加一次
n++;//J增加后肯定大于先前数,所以应该和数字段内下一位数比较,n自增
}
if ( n == ss.Length )//如果比较完所有数都够满足,则在该数字段后补足不够的数
{
for ( m = i;m < 5;m++)
{
sl.Add(j);
}
}
}
//int[]numary 为传入的源数据
//max 最小不重复的的N个数
public static int[] getMinNum(int[]numary,int max)
{
Array.Sort(numary);
int count=0;
int[] min5num=new int[max];
for(int i=1;i< numary.Length;i++)
{
if(numary[i-1]<(numary[i]-1))
{
int tmp=numary[i-1]+1;
for(int j=0; j< (numary[i]-numary[i-1]-1);j++)
{
if(count!=max)
{
min5num[count]=tmp;
tmp++;
count++;
}
}
}
if(count==(max-1))break;
}
if(count!=max)
{
int itmp=1;
for(int j=count;j {
min5num[j]=numary[numary.Length-1]+itmp;
itmp++;
}
}
return min5num;
}
测试通过
int[] ss = new int[] { 1, 2, 3, 4, 5 ,7};
int[] sl = new int[]{0,0,0,0,0};
int i = 0;
int j = 1;
int n = 0;
int m;
while(i < 5) // 5表示要找个数
{
if (j != ss[n] )//从1开始与该段数字第一比较,前提是以升序排好序的
{//如果不相同
sl[i] = j;//加入J
j++;//J使用一次后自增
i++;//加入一次后自增
}
else
{//如果相同
j++;//J增加一次
n++;//J增加后肯定大于先前数,所以应该和数字段内下一位数比较,n自增
}
if ( n == ss.Length )//如果比较完所有数都够满足,则在该数字段后补足不够的数
{
for ( m = i;m < 5;m++)
{
sl[m] = j;
j++;
}
break;
}
}
//显示数字
for ( int x = 0;x{
Console.WriteLine(sl[x].ToString());
}
Console.ReadLine();
public static int[] getMinNum(int[]numary,int max)
这里没有设置最小开始位,既以排序后的numary[0]位最小位
添加参数minstart,设置最小开始位
public static int[] getMinNum(int[]numary,int max,int minstart)
{
Array.Sort(numary);
int count=0;
int[] min5num=new int[max];
int tmp=0;
if(minstart {
tmp=minstart;
for(int i=count;i {
if(count!=max)
{
min5num[count]=tmp;
tmp++;
count++;
}
}
}
for(int i=1;i< numary.Length;i++)
{
if(numary[i-1]<(numary[i]-1))
{
tmp=numary[i-1]+1;
for(int j=0; j< (numary[i]-numary[i-1]-1);j++)
{
if(count!=max)
{
min5num[count]=tmp;
tmp++;
count++;
}
}
}
if(count==(max-1))break;
}
if(count!=max)
{
tmp=1;
for(int j=count;j {
min5num[j]=numary[numary.Length-1]+tmp;
tmp++;
}
}
return min5num;
}
如果表中已存在 10000个数字 , 1 , 2 , .... 10001 , 10003
int[] ss = new int[] { 1, 2, 3, 4, 5 ,7}; //这句怎么写 ?
static void Main(string[] args)
{
int[] temparr=new int[]{ 1 , 3 , 4 , 5 ,6 };
ArrayList al=new ArrayList();
//temparr.sort();
int G=temparr[temparr.Length-1];
int F=0;
int count=5;
int temp=1;
int L=1;
int M=0;
int N=0;
for(int i=1;i {
for(M=temparr[i]-temparr[i-1];M>1;M--)
{
if (temp>count)
{break;}
else
{
F=temparr[i-1]+1;
al.Add(F+N);
N+=1;
temp+=1;
}
}
}
for(int k=temp;k<=count;k++)
{
al.Add(G+L);
L+=1;
}
}//输出al即可,时间关系,该代码还可以简化的.
static void Main(string[] args)
{
int[] temparr=new int[]{ 1 ,2, 3 , 4 , 5 ,100 };
ArrayList al=new ArrayList();
//temparr.sort;
int G=temparr[temparr.Length-1];
int F=0;
int count=5;
int temp=0;
int L=1;
int M=0;
for(int i=1;i {
for(M=temparr[i]-temparr[i-1];M>1;M--)
{
if (temp>count-1)
{break;}
else
{
F=temparr[i-1]+1;
al.Add(F+temp);
temp+=1;
}
}
}
for(int k=temp;k {
al.Add(G+L);
L+=1;
}
}