Java 求给定整数最小反素的更好算法
我在HackerRank上发现了这个问题,我们应该找到最小的反素数(一个正整数是反素的当且仅当它的除数比任何其他比它小的正整数都多) 所以,如果用户输入5,那么最小的反质数将是6,因为6的除数比任何b/w 1到5的数都多 我的方法:-在哈希集中存储每个数字1到n的除数,然后从n+1检查除数比哈希集中除数多的整数Java 求给定整数最小反素的更好算法,java,algorithm,hashset,Java,Algorithm,Hashset,我在HackerRank上发现了这个问题,我们应该找到最小的反素数(一个正整数是反素的当且仅当它的除数比任何其他比它小的正整数都多) 所以,如果用户输入5,那么最小的反质数将是6,因为6的除数比任何b/w 1到5的数都多 我的方法:-在哈希集中存储每个数字1到n的除数,然后从n+1检查除数比哈希集中除数多的整数 public static int send(int n) { HashSet hs = new HashSet() ; for(int i=1
public static int send(int n)
{
HashSet hs = new HashSet() ;
for(int i=1 ; i<=n ; i++)
{
hs.add(div(i)) ;
}
for(int i= n+1 ; ; i++)
{
if(Collections.max(hs).compareTo(div(i)) < 0 )
{
return i ;
}
}
}
public static int div(int n)
{
int ctr = 0 ;
for(int i=1 ; i<=n ; i++)
{
if(n % i == 0)
ctr++ ;
}
return ctr ;
}
公共静态int发送(int n)
{
HashSet hs=新的HashSet();
对于(int i=1;i您可以使用Set
数据结构,然后您可以存储每次除数达到峰值时的除数(反素数)。然后您可以调用类似于天花()
的函数,从该数中获取下一个最大的除数,因此对于5
它将在O(logn)中返回6
time。另外,对于输出,使用StringBuilder
生成结果,然后输出。对我来说,它最初不适用于System.out.println()
,但先执行StringBuilder
,然后执行append()
结果。最后,执行.toString()
在StringBuilder
上。作为参考,我在比赛中获得了第八名(2000+中的第八名),因此它当时对我很有效,并且变得非常完美。我将评论中提到的修改合并到了这里:
public static int send(int n)
{
HashSet hs = new HashSet() ;
for(int i=int(n/2)+1 ; i<=n ; i++)
{
hs.add(div(i)) ;
}
int markToBeat = Collections.max(hs);
for(int i=n+1 ; ; i++)
{
if(div(i) > markToBeat )
{
return i ;
}
}
}
public static int div(int n)
{
int ctr = 0 ;
for(int i=1 ; i<=sqrt(n) ; i++)
{
if(n % i == 0)
ctr++ ;
}
return ctr ;
}
公共静态int发送(int n)
{
HashSet hs=新的HashSet();
对于(int i=int(n/2)+1;i标记为吃)
{
返回i;
}
}
}
公共静态整数div(整数n)
{
int ctr=0;
对于(int i=1;如果有人否决了这个问题,请说明原因。我觉得这很粗鲁。欢迎使用堆栈溢出…div中的循环应该只达到n的sqrt。您应该在send中的第二个循环之前存储哈希集的最大值,以避免多次查找相同的值…@RenukaDeshmukh,实际上需要相同的num通过在所有存储值的末尾调用max一次,可以节省一点内存,但不会对运行时产生太大影响。