当前位置:编程学习 > JAVA >>

求助各位大大们 一个算法题

有数组(a,b,b,c,c,c,d,d,d,d)经过某种算法简化成((1,a),(2,b),(4,c),(7,d)).现在有数组 (x1,x2,x2,x3,x3,x3,x4,x4,x4,x4.....xn)根据上面的例子写简化的算法.
求各位大大们解答
--------------------编程问答-------------------- 跪求帮忙 --------------------编程问答-------------------- 如果相同的都在一起,直接从头到尾遍历不就行了。一个变量记录数目。然后放到List或者数组中。 --------------------编程问答--------------------
引用 2 楼 u010863631 的回复:
如果相同的都在一起,直接从头到尾遍历不就行了。一个变量记录数目。然后放到List或者数组中。
能不能稍微具体点...我比较菜... --------------------编程问答-------------------- 也可以这样试试:定义一个Map<String,Integer>,String为你的x1,x2...,Integer为个数,从第一个开始循环,判断下一个是不是和之前的一个值相同,如果相同,Integer加1,继续判断下一个;如果不相同,直接添加进Map,Integer为1。 --------------------编程问答-------------------- 另一种思想就是查找位置,需要先将数组中不重复元素取出,然后用indexOf,和lastIndexOf查找位置,直接相减然后加1,得到个数。 --------------------编程问答--------------------
LinkedHashMap map = new LinkedHashMap();
for(int i=0; i<array.length; i++){
  Integer number = Integer.valueOf(i);
  Integer count = (Integer)map.get(nubmer);
  if(count==null){
    count=Integer.valueOf(0);
  }else{
    count=Integer.valueOf(count.intValue()+1);
  }
  map.put(number, count);
}
for(Iterator iter=map.entrySet();iter.hasNext();){
  Map.Entry entry = (Map.Entry)iter.next();
  System.out.println(entry.getValue()+","+entry.getKey());
}
--------------------编程问答-------------------- 主要是找着规律吧,n*(n-1)/2+1,遍历都好办^_^ --------------------编程问答-------------------- 应该不是很难吧 --------------------编程问答--------------------

String[] a={"a","b","b","c","c","c","d","d","d","d","f","f","f","f","f"};
List<String> list = new ArrayList<String>();
String str = "";
for(String b : a){
str+=b;
}
int i = 0;
while(i < a.length){
str.substring(i);
int start = str.indexOf(a[i]);
int end = str.lastIndexOf(a[i]);
list.add("("+(start+1)+","+a[i]+")");
i = end +1;
}
for(String show : list){
System.out.println(show);
}

新手写的 可能想法不是很好 楼上那种用map去做的也很不错 --------------------编程问答-------------------- 映射都用上了啊,不太需要吧,一次遍历先算出不同字符的个数,然后建个数组,再次遍历计算每个字符的个数,不就结了 --------------------编程问答-------------------- 只要遍历一次数组,记录数组中与前一个元素的值不一样的元素的值及其下标就可以了。
String[] str={"a","b","b","c","c","c","d","d","d","d",
"f","f","f","f","f","g","g","g","h","h","h"};
for(int i=0;i<str.length;i++){
if(i==0) System.out.println((i+1)+","+str[i]);
if(i>0){
if(str[i].equals(str[i-1])) continue;
System.out.println((i+1)+","+str[i]);
}
} --------------------编程问答-------------------- 字母首次出现的位置坐标,只要遍历一次即可。需要一个辅助Map存放不重复的出现的字母,和它的位置。

--------------------编程问答-------------------- 11楼是好方法,不用消耗额外空间;况且,如果是面试题的话,优先选择“不调用集合API”的简单解法。 --------------------编程问答-------------------- 顶11楼,写的很棒。先记录第一个,依次向后,与相邻前一个比较 相同则过,不同则记 --------------------编程问答--------------------
引用 7 楼 rencht 的回复:
主要是找着规律吧,n*(n-1)/2+1,遍历都好办^_^


说实话  我赞同这个 楼主给的数组很有规律 第一个为1 第二个为1 + 1 第三个为1 + 2 + 1

第四个为1 + 2 + 3 + 1  第n个为1 + 2 + 3 +.... + (n - 1) + 1  公式就是7楼那个了

如果楼主本意不是如此 可忽略本条回复
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,