统计数组[1-n]中各个元素出现的次数,时间复杂度O(n),空间复杂度O(1),可改变数组结构

* 统计数组中每个元素出现的次数

* 数组长度为N,每个元素范围为[1,N]。

* 统计各个元素出现的次数,要求时间复杂度为O(N),空间复杂度为O(1)。可以修改数组中元素的值。

*

* 思路:遍历到每一个元素,将该(元素值 - 1)作为下标值,将该下标的元素赋值(若为正,赋值-1;若为负值,-1)

* 最后,每个下标中存储的元素即为统计次数,而下标+1即为元素值。

代码:

public static void main(String[] args) {
        // TODO Auto-generated method stub
        int n = 6;
        int[] a = new int[]{6,2,4,1,2,5};
        int i = 0;

        //采用while循环
        while(i < n){
            //由于元素取值范围为[1,N],因此,可以将(当前元素值-1)作为下标值,找到相应位置处的元素,将其存储的值作为-times,因为原来存储值都为正值,为防止混淆,用负值存储
            int temp = a[i] - 1;
            if(temp < 0){ //表示该元素已经处理过了,跳过
                i++;
                continue;
            } else if(a[temp] > 0){//第一次处理一个值
                a[i] = a[temp];//暂存新元素
                a[temp] = -1;
            } else {//已经不是第一次处理该值了

                a[i] = 0; //没有新的元素要处理,置0
                a[temp]--;
            }
        }

        for(int j = 0; j < n; ++j){
            System.out.print(j+1 + " , " + -a[j] + "\t");
        }
    }
时间: 2024-12-10 20:41:55

统计数组[1-n]中各个元素出现的次数,时间复杂度O(n),空间复杂度O(1),可改变数组结构的相关文章

判断数组或者集合中重复元素的个数。

当我们需要对数组或者集合中的元素进行重复元素个数时,我们不妨使用map来完成此操作. 由于map中key是唯一的,所以利用这一特性就可以对数组中重复元素进行统计. java实现代码如下. String[] names={"a","b","a","b","c"}; Map<String,Integer> sameElement=new HashMap<String,Integer>()

reduce实现计算数组中每个元素出现的次数 数组去重 将多维数组转化为一维

// js计算数组中每个元素出现的次数 // var names = ['Alice', 'Bob', 'Tiff', 'Bruce', 'Alice']; // var countedNames = names.reduce(function (allNames, name) { // if (name in allNames) { // allNames[name]++; // } // else { // allNames[name] = 1; // } // return allName

python 统计list中各个元素出现的次数

python 统计list中各个元素出现的次数利用Python字典统计利用Python的collection包下Counter的类统计利用Python的pandas包下的value_counts的类统计利用字典dict来完成统计举例: a = [1, 2, 3, 1, 1, 2]dict = {}for key in a: dict[key] = dict.get(key, 0) + 1print dict12345输出结果: >>>{1: 3, 2: 2, 3: 1}1利用Python

用python统计list中各元素出现的次数(同理统计字符串中各字符出现的次数)

统计list中各元素出现的次数,下面的方法也适用于统计字符串中各字符出现的次数 1.用字典的形式来处理 a = "abhcjdjje" a_dict = {}for i in a: a_dict[i] = a.count(i)print(a_dict) 2.用count函数直接打印出来 L = [2,4,5,6,2,6,0,4] for i in L: print("%d的次数:%d"%(i,L.count(i))) 3.用collections的Counter函数

如何用Python统计《论语》中每个字的出现次数?10行代码搞定--用计算机学国学

编者按: 上学时听过山师王志民先生一场讲座,说每个人不论干什么,都应该学习国学(原谅我学了计算机专业)!王先生讲得很是吸引我这个工科男,可能比我的后来的那些同学听课还要认真些,当然一方面是兴趣.一方面是跨了学科听课,内容引人入胜,主要还是我懂得太少了,哈!我记得当时讲座的主题是有关孔子与齐鲁大地的关系,也正是那场讲座让我下决心跨学院选修了<中国古代思想文化史研究>,才让我对于诸子百家思想有了更深的认识,教授们轮番上阵,让我们学习到我们中华民族先贤智慧.也认识了历史学和中国哲学专业的同学,其中还

统计一段长字符串中某字符串的出现次数

截取字符串统计字符串出现次数 通过替换字符串,统计字符串出现次数 通过正则表达式,统计字符串出现次数 package constxiong.interview; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * 统计一段长字符串中某字符串的出现次数 * @author ConstXiong * @date 2019-11-13 11:01:22 */ public class TestCountWordTi

统计数组中每个元素出现的次数

Dictionary<string, int> counter = new Dictionary<string, int>(); foreach (string c in 数组) { if (counter.ContainsKey(c)) { counter[c]++; } else { counter.Add(c, 1); } if (counter[max] < counter[c]) max = c; } max为元素 counter[max]出现次数最多的元素出现的次

javascript在数组的循环中删除元素

在开发JavaScript应用的过程中,经常会遇到在循环中移除指定元素的需求. 按照常规的思路,就是对数组进行一个for循环,然后在循环里面进行if判断,在判断中删除掉指定元素即可. 但是实际情况往往不会像预想的那样顺利运行. 出现的问题场景还原 (function () { var arr = [1, 2, 2, 3, 4, 5]; for (var i = 0; i < arr.length; i++){ // 打印数组中的情况,便于跟踪数组中数据的变化 console.log(i + '

用最小的空间复杂度找出一个长度为n的数组且数据中的元素是[0,n-1]中任一个重复的数据。

比如:[1, 2, 3, 3, 2, 2, 6, 7, 8, 9] 中 2 or 3 分析:这道题目,实现比较容易,方法也不少,但要用最小的空间复杂度来看的话, 和充分考虑一下数据的下标和数据元素值的特点,比如如果把第 i 个位置放的值是 i,不是的情况做交换,去循环对比. 时间复杂度O(n),空间复杂度可到常量级 测试代码如下: public static void main(String[] args) { int n=10; List<Integer> list = new ArrayL