当前位置: 首页 > 知识库问答 >
问题:

编码二进制周期

施赞
2023-03-14

这是一个考题,我想一定有更有效的方法。(我也知道有一种方法可以直接转换二进制数,而不需要经过二进制字符串,但我不知道如何转换)。

这就是问题所在:

给出了一个由Q字符组成的非空零索引字符串S。该字符串的周期是最小的正整数P,使得:

P≤ Q/2和S[K]=S[kp]表示0≤ K

例如,8是“Codilityco”的时期。如果M是N的二进制表示的周期,则正整数M是正整数N的二进制周期。

例如,4是955的二进制周期,因为955的二进制表示是“1110111011”,它的周期是4;另一方面,102没有二进制周期,因为它的二进制表示是“1100110”,它没有周期。

编写一个函数:

int solution(int N);

给定一个正整数N,返回N的二进制周期。函数应该返回−如果N没有二进制周期,则为1。

例如,给定N=955,函数应该返回4,给定N=102,函数应该返回−1,如上例所述。

假设:

N是[1..100000000]范围内的整数。

复杂性:

>

预计最坏情况下的空间复杂度为O(log(N))。

公共类第二个任务{public int solution(int N){String binario=Integer.tobinarysting(N);

      int minimo = Integer.MAX_VALUE;
      int Q = binario.length();

      for(int P=1;P<Q;P++)
      {
          float der =Q/2;
          if(P<=der)
          {
              int delta = Q-P;
              int fail=0;
              for(int K=0;K<delta;K++)
              {
                  if(binario.charAt(K)!=binario.charAt(K+P))
                  {
                      K=delta;
                      fail=1;
                  }
              }
              if(fail!=1)
              {
                  if(P<minimo)
                  {
                      minimo=P;
                  }
              }
          }
      }
      if(minimo==Integer.MAX_VALUE)
      {
          return -1;
      }
      return minimo;
  }    

}

可能代码效率极低,但当我们进行时,我会修复它。应该是简单的:-(。

编辑:在@Eran的帮助下,这是新代码。运行时间几乎相同,但现在很干净。

public class SecondTask {
    public int solution(int N) 
    {
        String binario = Integer.toBinaryString(N);
        
        int minimo = Integer.MAX_VALUE;
        int Q = binario.length();
        System.out.println("binario: "+binario);
        for(int P=1;P<Q/2;P++)
        {
            System.out.print("P: "+P);
            int delta = Q-P;
            int fail=0;
            for(int K=0;K<delta;K++)
            {
                System.out.print(" "+binario.charAt(K));                
                if(binario.charAt(K)!=binario.charAt(K+P))
                {

                    K=delta;
                    fail=1;
                }
            }
            System.out.println("");
            if(fail!=1)
            {
                return P;
            }
        }
        
        if(minimo==Integer.MAX_VALUE)
        {
            return -1;
        }
        return minimo;
    }    
}

共有1个答案

卫琛
2023-03-14

您的实现并不理想。

例如

for(int P=1;P<Q;P++)
{
    float der =Q/2;
    if(P<=der)

你可以写

for(int P=1;P<=Q/2;P++)
{

这可以为您节省一些什么都不做的迭代。

我要做的另一个改变是替换:

        if(fail!=1)
        {
            if(P<minimo)
            {
                minimo=P;
            }
        }

与:

        if(fail!=1)
        {
           return P;
        }

因为一旦你找到了一个有效周期的P,你就可以停止搜索。

然而,这些改进不会改变时间复杂性,而且您的实现已经满足了复杂性要求。

数字NO(log(N))位表示,因此Q=O(log(N))

您的实现在一个循环中有一个循环,每个循环的大小都小于Q。因此,最坏情况下的时间复杂度受Q^2的限制,即O(log(N)^2),这是所需的复杂度。

还满足了O(log(N))的空间复杂度,因为您使用的唯一非恒定长度存储是N的二进制字符串表示(binario变量),其长度为O(log(N))

我不确定是否有更好的时间复杂度的实现。

 类似资料:
  • 我有一个Ruby on Rails Postgresql应用程序,可以将文件图像保存到数据库中,在某些帖子安装中,数据被错误地保存为看起来像其他字节的格式,因此某些帖子安装中的图像无法正确返回文件 工作保存的数据 \xFF\xD 8\xFF\xE 1\x 00\x\xFF\x EE\x 00\x 0 E Adobe\x 00 d\xC 0\x 00\x 00\x 00\x 00\x 01\xFF\

  • 我使用apache camel Netty使用此代码将ebcdic输入转换为ascii。 任何建议或答案...

  • 问题内容: 我使用python 3,我尝试将二进制文件写入使用r + b的文件。 其中,binary是包含数字的列表。如何将其写入二进制文件? 最终文件必须看起来像b’x07 \ x08 \ x07 \ 谢谢 问题答案: 当您以二进制模式打开文件时,实际上就是在使用该类型。因此,当您写入文件时,您需要传递一个对象,而从文件中读取时,您将获得一个对象。相反,以文本模式打开文件时,您正在使用对象。 因

  • 问题内容: 我知道用和 将小数转换为二进制(在这里我取32位结果的低16位)。 我想做的是另一种方法,并采用16位二进制补码二进制字符串并将其转换为十进制。 即 而不是 我该怎么做? 问题答案: 您需要将结果读取到中。 此打印。

  • 我试图使用python中的“二进制”节俭数据类型来发送二进制数据。当实际的客户端操作开始时(在实际发送之前),客户端会触发一个异常,抱怨UTF编码。Thrift Python库不支持真正的二进制编码吗?这是因为我使用的是JSON协议,而该协议不为二进制定义保护自身。在后台,Thrift 0.9.1生成一个“二进制”字段作为“字符串”(Java和C也是如此)。这就是此时“二进制”的本质吗? 我的Th