数组中数字出现的次数

Posted 赵jc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数组中数字出现的次数相关的知识,希望对你有一定的参考价值。

连续子数组的最大和

https://leetcode-cn.com/problems/lian-xu-zi-shu-zu-de-zui-da-he-lcof/

class Solution 
    public int maxSubArray(int[] nums) 
        if(nums == null || nums.length == 0) 
            return -1;
        
        int ret = nums[0];
        for(int i = 1; i < nums.length; i++) 
            nums[i] += Math.max(nums[i - 1], 0);
            ret = Math.max(ret, nums[i]);
        
        return ret;
    

乘积最大子数组(最大连续数子数组的积)

https://leetcode-cn.com/problems/maximum-product-subarray/

class Solution 
     public int maxProduct(int[] nums) 
        int max = Integer.MIN_VALUE, imax = 1, imin = 1; //一个保存最大的,一个保存最小的。
        for(int i=0; i<nums.length; i++)
            if(nums[i] < 0) 
                int tmp = imax; 
                imax = imin; 
                imin = tmp;
                 
                //如果数组的数是负数,那么会导致最大的变最小的,最小的变最大的。因此交换两个的值。
            imax = Math.max(imax*nums[i], nums[i]);
            imin = Math.min(imin*nums[i], nums[i]);
            
            max = Math.max(max, imax);
        
        return max;
    

数组的奇偶排序

https://leetcode-cn.com/problems/sort-array-by-parity/submissions/

class Solution 
    public int[] sortArrayByParity(int[] nums) 
        if(nums == null || nums.length == 0) 
            return new int[0];
        
        int[] ret = new int[nums.length];
        int i = 0, j = nums.length - 1;
        for(int k = 0; k < nums.length; k++) 
            if(nums[k] % 2 == 0) 
                ret[i++] = nums[k];
            else 
                ret[j--] = nums[k];
            
        
        return ret;
    

数组的奇偶排序(当 A[i] 为奇数时,i 也是奇数;当 A[i] 为偶数时, i 也是偶数)

class Solution 
    public int[] sortArrayByParityII(int[] nums) 
        if(nums == null || nums.length == 0) 
            return new int[0];
        
        int[] ret = new int[nums.length];
        int even = 0, odd = 1;
        for(int i = 0; i < nums.length; i++) 
            if(nums[i] % 2 == 0) 
                ret[even] = nums[i];
                even += 2;
            else 
                ret[odd] = nums[i];
                odd += 2;
            
        
        return ret;
    

删除有序数组中的重复项

https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/

class Solution 
    public int removeDuplicates(int[] nums) 
        if(nums == null || nums.length == 0) return 0;

    int p = 0;
    int q = 1;
    while(q < nums.length)
        if(nums[p] != nums[q])
            nums[p + 1] = nums[q];
            p++;
        
        q++;
    
    return p + 1;
    

给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 最多出现两次 ,返回删除后数组的新长度

https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array-ii/

class Solution 
    public int removeDuplicates(int[] nums) 
        if(nums.length <= 2) return nums.length;
        
        int index = 2;
        for(int i = 2; i < nums.length; i++)
            if(nums[i] != nums[index-2])
                nums[index++] = nums[i];
        
        
        return index;
    

数组中出现次数超过一半的数字

https://leetcode-cn.com/problems/shu-zu-zhong-chu-xian-ci-shu-chao-guo-yi-ban-de-shu-zi-lcof/

class Solution 
    public int majorityElement(int[] nums) 
        int val = 0, count = 0;
        for(int x : nums) 
            if(count == 0) 
                val = x;
                count = 1;
            else 
                if(val == x) 
                    count++;
                else 
                    count--;
                
            
        
        return val;
    

数组中有些元素出现两次而其他元素出现一次。找到所有出现两次的元素。

https://leetcode-cn.com/problems/find-all-duplicates-in-an-array/

class Solution 
    //输入输出的空间不属于额外空间,可以在输入数组中用数字的正负来表示该位置所对应数字是否已经出现过。遍历输入数组,给对应位置的数字取相反数,如果已经是负数,说明前面已经出现过,直接放入输出数组。
    public List<Integer> findDuplicates(int[] nums) 
         List<Integer> ret = new ArrayList<>();
        for(int i = 0;i < nums.length; i++) 
            int num = Math.abs(nums[i]);
        	if(nums[num-1] < 0) 
        		ret.add(Math.abs(nums[i]));
        	else 
        		nums[num-1] *= -1;
        	
        
        return ret;
    

数组中两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字

https://leetcode-cn.com/problems/shu-zu-zhong-shu-zi-chu-xian-de-ci-shu-lcof/

class Solution 
    public int[] singleNumbers(int[] nums) 
       int x = 0, y = 0, n = 0, m = 1;
        for(int num : nums)               // 1. 遍历异或
            n ^= num;
        while((n & m) == 0)               // 2. 循环左移,计算 m
            m <<= 1;
        for(int num: nums)               // 3. 遍历 nums 分组
            if((num & m) != 0) x ^= num;  // 4. 当 num & m != 0
            else y ^= num;                // 4. 当 num & m == 0
        
        return new int[] x, y;          // 5. 返回出现一次的数字
    

在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字

https://leetcode-cn.com/problems/shu-zu-zhong-shu-zi-chu-xian-de-ci-shu-ii-lcof/comments/

class Solution 
    //书上解法: 如果一个数字出现3次,它的二进制每一位也出现的3次。如果把所有的出现三次的数字的二进制表示的每一位都分别加起来,那么每一位都能被3整除。 我们把数组中所有的数字的二进制表示的每一位都加起来。如果某一位能被3整除,那么这一位对只出现一次的那个数的这一肯定为0。如果某一位不能被3整除,那么只出现一次的那个数字的该位置一定为1.
    public int singleNumber(int[] nums) 
     int[] k = new int[32];
        for (int num : nums) 
            for (int i = 0; i < 32; i++) 
                k[i] += num & 1;
                num >>= 1;
            
        
        int ret = 0;
        for (int i = 0; i < 32; i++) 
             ret |= (k[i] % 3) << i;
        
        return ret;
    

三数之和

https://www.nowcoder.com/questionTerminal/345e2ed5f81d4017bbb8cc6055b0b711

import java.util.*;
public class Solution 
    public ArrayList<ArrayList<Integer>> threeSum(int[] nums) 
        ArrayList<ArrayList<Integer>> ret = new ArrayList<>();
        if(nums == null || nums.length == 0) 
           return ret;
        
        int len = nums.length;
        Arrays.sort(nums);
        for(int i = 0; i < len; i++) 
            if(nums[i] > 0) 
                break;
            
            if(i > 0 && nums[i] == nums[i - 1]) 
                continue;
            
            int l = i + 1, r = len - 1;
            while(l < r) 
                int sum = nums[i] + nums[l] + nums[r];
                if(sum == 0) 
                    ArrayList<Integer> tmp = new ArrayList<>();
                    tmp.add(nums[i]);
                    tmp.add(nums[l]);
                    tmp.add(nums[r]);
                    ret.add(tmp);
               
                while(l < r && nums[l] == nums[l + 1]) 
                    l++;
                
                l++;
                else if(sum < 0) 
                    l++;
                else 
                    r--;
                
            
        
        return ret;
    

以上是关于数组中数字出现的次数的主要内容,如果未能解决你的问题,请参考以下文章

数组中数字出现的次数

数组中数字出现的次数

编程算法 - 数组中出现次数超过一半的数字 代码(C)

《剑指Offer——数字在排序数组中出现的次数》代码

数组中出现次数超过一半的数字

php如何实现统计一个数字在排序数组中出现的次数(代码)