论坛首页 入门技术论坛

有个很诡异的需求,向高手请教最优解

浏览 15787 次
该帖已经被评为新手帖
作者 正文
   发表时间:2006-10-12  
可能没说清楚
list里面如果是对象。
0 请登录后投票
   发表时间:2006-10-12  
完全不知道你在说什么
0 请登录后投票
   发表时间:2006-10-12  
ddandyy 写道
完全不知道你在说什么

内容已经修改了你可以在看一下,只是想说明list里面的内容是对象不是字符串,不过影响不大,要求最优解。
0 请登录后投票
   发表时间:2006-10-12  
是对象   是什么对象
不定?  ABC是一种的不同 还是不是一种
还有就是 相同的是顺序还是乱序
0 请登录后投票
   发表时间:2006-10-12  
我做了一个o(n)的,大家看看怎么样.

这是打印函数

public static void printSum(ArrayList list){
  Collections.sort(list);

  String curr="";
  String last="";
  WordCount wc=null;
  
  for(int i=0;i<list.size();i++){
    curr=(String)list.get(i);
    
    if(i==0){
      wc=new WordCount(curr,1);
      last=curr;
      continue;
    }
    
    if(curr.equals(last)){
      wc.increaseCount();
    }
    else{
      wc.print();
      wc.changeWord(curr);
    }
    
    last=curr;
  }

  wc.print();// 这个地方容易漏一个
}
  
这是WordCount类
public class WordCount{
  private String word;
  private int count;
  
  public WordCount(String word,int count){
    this.word=word;
    this.count=count;
  }
  
  public void increaseCount(){
    count=count+1;
  }
  
  public void print(){
    System.out.println(word+"*"+count);
  }
  
  public void changeWord(String newWord){
    word=newWord;
    count=1;
  }
  
  public int getCount() {
    return count;
  }
  public void setCount(int count) {
    this.count = count;
  }
  public String getWord() {
    return word;
  }
  public void setWord(String word) {
    this.word = word;
  }
}

这是调用部分:
  public static void main(String[] arg){  
    ArrayList list=new ArrayList();
    
    list.add("a");
    list.add("a");
    list.add("b");
    list.add("c");
    list.add("c");
    list.add("e");
    list.add("天朝");
    list.add("天朝");
    list.add("天朝");
    list.add("鸡屁国");
    list.add("南棒棒");
    list.add("北棒棒");
    list.add("阿妹例假国");
    list.add("公鸡国");
    list.add("罗撒国");
    list.add("阿妹例假国");
    list.add("阿妹例假国");
    list.add("天朝");
    list.add("天朝");
    list.add("天朝");
    list.add("北棒棒");
    
    printSum(list);
  }
  
输出结果如下:
a*2
b*1
c*2
e*1
公鸡国*1
北棒棒*2
南棒棒*1
天朝*6
罗撒国*1
阿妹例假国*3
鸡屁国*1
0 请登录后投票
   发表时间:2006-10-12  
gamex 写道
foxty 写道
遍历然后对每个字母计数不就OK了?

我上面不是说过了,解它没什么问题,我求的是最优解(用最少的代码来解它)


楼主,不求速度最快求代码最少啊!这是什么需求? 我的ID可以形容--行为艺术.
0 请登录后投票
   发表时间:2006-10-12  
不好意思,没看楼主题设,不改原值做个拷贝就可以.

大家讨论一下算法吧,扣细节意义不大,毕竟我们是来交流讨论而不是来做作业或者完成项目的,不用那么一丝不苟.
0 请登录后投票
   发表时间:2006-10-12  
给个递归的:

public static String bar(List<Object> lst, Map<Object, Integer> map) {
  if(lst.size()==0) {
    Iterator<Map.Entry<Object, Integer>> it = map.entrySet().iterator();
    StringBuilder result = new StringBuilder();
    while(it.hasNext()) {
      Map.Entry<Object, Integer> entry = it.next();
      if(entry.getValue()==1)
        result.append(entry.getKey().toString() + ";");
      else
        result.append(entry.getKey().toString() + "*" + entry.getValue() + ";");
    }
    return result.toString();
  } else {
    Object c = lst.remove(0);
    Integer i = map.get(c);
    if(i==null) map.put(c, 1); else map.put(c, i+1);
    return bar(lst, map);
  }
}

.......

public static void main(String[] args) {
  ArrayList<Object> arrLst = new ArrayList<Object>();
  arrLst.add('a'); 
  arrLst.add('b');
  arrLst.add('b');
  arrLst.add('b');
  arrLst.add('c');
  arrLst.add('c');
  arrLst.add('d');
  arrLst.add('d');
  arrLst.add('e');
  arrLst.add("recursion");
  arrLst.add("recursion");
  arrLst.add("recursion");
  arrLst.add("fp");
  arrLst.add("fp");
  System.out.println(bar(arrLst, new LinkedHashMap<Object, Integer>()));
}

0 请登录后投票
   发表时间:2006-10-12  
行为艺术家 写道
gamex 写道
foxty 写道
遍历然后对每个字母计数不就OK了?

我上面不是说过了,解它没什么问题,我求的是最优解(用最少的代码来解它)


楼主,不求速度最快求代码最少啊!这是什么需求? 我的ID可以形容--行为艺术.

我的意思是在保证速度的情况下的最优解
0 请登录后投票
   发表时间:2006-10-12  
楼上的兄弟,排序完了就不用递归吧.
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics