`
acen.chen
  • 浏览: 157402 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

一道算法题

阅读更多
题目是这样的:给你10分钟时间,根据上排给出十个数,在其下排填出对应的十个数 
要求下排每个数都是先前上排对应那个数在下排十个数中出现的次数。 
上排的十个数如下: 
【0,1,2,3,4,5,6,7,8,9】
题目是这样的:给你10分钟时间,根据上排给出十个数,在其下排填出对应的十个数 
要求下排每个数都是先前上排对应那个数在下排十个数中出现的次数。 
上排的十个数如下: 
【0,1,2,3,4,5,6,7,8,9】

 

JavaEye论坛里面有人给出了一个java实现的算法。

Java代码 
public class Test    
{    
  public static void main(String[] args)    
  {    
    NumberTB nTB = new NumberTB(10);    
        
    int[] result = nTB.getBottom();    
    for(int i=0;i<result.length;i++)    
    {    
      System.out.print(result[i] + " ");    
    }    
  }    
}    
   
class NumberTB    
{    
  private int[] top;    
  private int[] bottom;    
  private int len;    
  private boolean success;    
      
  //please into len >= 4    
  public NumberTB(int len)    
  {    
    this.len = len <= 4 ? 4 : len;    
    this.success = false;    
        
    this.top = new int[this.len];    
    this.bottom = new int[this.len];    
        
    //format top    
    for(int i=0;i<this.len;i++)    
    {    
      this.top[i] = i;    
    }    
  }    
      
  public int[] getBottom()    
  {    
    int i = 0;    
        
    while(!this.success)    
    {    
      i++;    
      setNextBottom();    
    }    
        
    System.out.println("执行了: " + i + "次循环得到结果");    
        
    return this.bottom;    
  }    
      
  //set next bottom    
  private void setNextBottom()    
  {    
    boolean reB = true;    
        
    for(int i=0;i<this.len;i++)    
    {    
      int frequecy = getFrequecy(i);    
          
      if(this.bottom[i] != frequecy)    
      {    
        this.bottom[i] = frequecy;    
        reB = false;    
      }    
    }    
        
    this.success = reB;    
  }    
      
  //get frequency in bottom    
  private int getFrequecy(int num)    
  {    
    int count = 0;    
        
    for(int i=0;i<this.len;i++)    
    {    
      if(this.bottom[i] == num)    
        count++;    
    }    
        
    return count;    
  }    
}   
public class Test
{
  public static void main(String[] args)
  {
    NumberTB nTB = new NumberTB(10);
    
    int[] result = nTB.getBottom();
    for(int i=0;i<result.length;i++)
    {
      System.out.print(result[i] + " ");
    }
  }
}

class NumberTB
{
  private int[] top;
  private int[] bottom;
  private int len;
  private boolean success;
  
  //please into len >= 4
  public NumberTB(int len)
  {
    this.len = len <= 4 ? 4 : len;
    this.success = false;
    
    this.top = new int[this.len];
    this.bottom = new int[this.len];
    
    //format top
    for(int i=0;i<this.len;i++)
    {
      this.top[i] = i;
    }
  }
  
  public int[] getBottom()
  {
    int i = 0;
    
    while(!this.success)
    {
      i++;
      setNextBottom();
    }
    
    System.out.println("执行了: " + i + "次循环得到结果");
    
    return this.bottom;
  }
  
  //set next bottom
  private void setNextBottom()
  {
    boolean reB = true;
    
    for(int i=0;i<this.len;i++)
    {
      int frequecy = getFrequecy(i);
      
      if(this.bottom[i] != frequecy)
      {
        this.bottom[i] = frequecy;
        reB = false;
      }
    }
    
    this.success = reB;
  }
  
  //get frequency in bottom
  private int getFrequecy(int num)
  {
    int count = 0;
    
    for(int i=0;i<this.len;i++)
    {
      if(this.bottom[i] == num)
        count++;
    }
    
    return count;
  }
} 下面给出一个更具一般性的结论:

这个是有规律可循的,不仅0~9有唯一解,0~n都只有唯一解。关键是最后面一个1它可以左右移动,1和2下面的数永远是2和1,0下面对应的数为n-3(n>=3),上排数n-3下面对应的数为1,其它上排数下面对应为0就ok了。有了这个一般性的结论再大的数都可以马上给出答案。 
比如 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 
    12 2 1 0 0 0 0 0 0 0 0 0 1 0 0 0

请大家验证,这个算法可以用到数据压缩领域。
 
本篇文章来源于:网贝建站 http://www.netbei.com   原文链接:http://www.netbei.com/2009/0619/6657.html

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics