刷题——数组模块(java)---简单题

举报
Studying-swz 发表于 2022/10/16 20:21:45 2022/10/16
【摘要】 一.867. 转置矩阵----2021/1/11class Solution { public int[][] transpose(int[][] A) { int[][] B = new int[A[0].length][A.length]; for(int i = 0;i<A.length;i++){ for(int j = 0;...

一.867. 转置矩阵----2021/1/11

在这里插入图片描述

class Solution {
    public int[][] transpose(int[][] A) {
        int[][] B = new int[A[0].length][A.length];
        for(int i = 0;i<A.length;i++){
            for(int j = 0;j<A[0].length;j++){
                B[j][i] = A[i][j];
            }
        }
        return B;
    }
}

注:这就不用说了,看代码吧。


二.面试题 17.10. 主要元素----2021/1/11

在这里插入图片描述

class Solution {
    public int majorityElement(int[] nums) {
        Map<Integer,Integer> map = new HashMap<Integer,Integer>();
        for(int i=0;i<nums.length;i++){
            if(!map.containsKey(nums[i])){
                map.put(nums[i],1);
            }else{
                map.put(nums[i],map.get(nums[i])+1);
            }
        }
        int max = Integer.MIN_VALUE;
        int maxvalue = Integer.MIN_VALUE;
        Set<Integer> keySet = map.keySet(); 
        for(Integer value:keySet){
            if(map.get(value)>max){
                max = map.get(value);
                maxvalue = value;
            }
        }
        return max<=nums.length/2?-1:maxvalue;
    }
}

还有一种方法,就是利用 Arrays.sort(a);对数组排序,那么如果由超过一半则必定连着超过一半的数量,这时候可以双指针!以后在补!


三.977. 有序数组的平方----2021/1/11

在这里插入图片描述

class Solution {
    public int[] sortedSquares(int[] nums) {
        int[]newnums = new int[nums.length];
        for(int i = 0;i<nums.length;i++){
            newnums[i] = Math.abs(nums[i]);
        }
        Arrays.sort(newnums);
        for(int i=0;i<nums.length;i++){
            newnums[i] = (int)Math.pow(newnums[i],2);
        }
        return newnums;
    }
}

四.628. 三个数的最大乘积----2021/1/12

在这里插入图片描述

class Solution {
    public int maximumProduct(int[] nums) {
        Arrays.sort(nums);
        int length = nums.length;
        int max = nums[length-1] * nums[length-2] * nums[length-3];
        max = max>nums[0] * nums[1] *nums[length-1]?max:nums[0]*nums[1]*nums[length-1];
        return max;
    }
}

思路: 排序后,最大值应该为最后三个数或者前两个数和最后一个数!可以自己举几个例子比较一下。


五.1550.存在连续三个奇数的数组----2021/1/12

在这里插入图片描述

class Solution {
    public boolean threeConsecutiveOdds(int[] arr) {
        int length = arr.length;
        int index = 0;
        for(int i =0;i<length;i++){
            if(index == 3){
                return true;
            }
            if(arr[i]%2!=0){
                index++;
            }else{
                index = 0;
            }
        }
        if(index==3)
            return true;
        else    
            return false;
    }
}

思路: for循环,统计奇数的个数,当等于3个,直接返回,否则重新计数。


六.219.存在重复元素 II----2021/1/12

在这里插入图片描述

class Solution {
    public boolean containsNearbyDuplicate(int[] nums, int k) {
        int length = nums.length;
        for(int i =0;i<length;i++){
            for(int j=i+1;j <= k+i && j<length;j++){
                if(nums[i] == nums[j])
                    return true;
            }
        }
        return false;
    }
}

思路: 和上面那道题差不多,同理for循环。


七.228. 汇总区间—2021/1/12

在这里插入图片描述

class Solution {
    public List<String> summaryRanges(int[] nums) {
        List<String> list = new ArrayList<String>();
        int length = nums.length;
        if(length == 0){
            return list;
        }
        int first = nums[0];
        int end = nums[0];
        for(int i=1;i<length;i++){
            int cur = nums[i];
            if(cur==end+1)
                end = cur;
            else{
                if(first == end){
                    list.add(String.valueOf(first));
                }else{
                    list.add( first + "->" + end);
                }
               
                first = end = nums[i];
            }
        }
        if(first == end){
            list.add(String.valueOf(first));
        }else{
            list.add( first + "->" + end);
        }
        return list;
    }
}

思路: for循环或者理解为双指针,前指针指向头部,后指针指向尾部,当相邻数一个一个的增加时,后指针移动,当出现跳跃时,前后指针同时移动,注意数组为空以及最后情况的重新判断!


八.605. 种花问题—2021/1/12

在这里插入图片描述

class Solution {
    public boolean canPlaceFlowers(int[] flowerbed, int n) {
        int length = flowerbed.length;
        if(n==0)
            return true;
        //只有一个数时
        if(length==1&&flowerbed[0] == 0){
            return true;
        }else if(length==1&&flowerbed[0]==1){
            return false;
        }
        //计算开头
        if(flowerbed[0]==0 && flowerbed[1]==0){
            flowerbed[0]=1;
            n--;
        }
        //计算中间
        for(int i=1;i<length-1;i++){
            if(flowerbed[i-1]==0 && flowerbed[i+1]==0 && flowerbed[i]==0){
                flowerbed[i] = 1;
                n--;
            }
        }
        //计算末尾
         if(flowerbed[length-1]==0 && flowerbed[length-2]==0){
            flowerbed[length-1]=1;
            n--;
        }
        return n>0?false:true;
    }
}

思路: 同理for循环,单独处理开头和末尾,这里为什么可以从头到尾直接走一遍,主要是最优结果是越靠前越好,或者从尾到头越靠后越好。


九.832. 翻转图像—2021/1/12

在这里插入图片描述

class Solution {
    public int[][] flipAndInvertImage(int[][] A) {
        int row = A.length;
        int col = A[0].length;
        for(int i=0;i<row;i++){
            for(int j =0;j<col/2;j++){
                int temp = A[i][j];
                A[i][j] = A[i][col-j-1]==0?1:0;
                A[i][col-j-1] = temp==0?1:0;
            }
            if(col%2!=0){
                A[i][col/2] =   A[i][col/2]==0?1:0;
            }
        }
        return A;
    }
}

思路: 注意反转图片的时候,当列为奇数的时候要把中间的那一位单独反转。


十.1672. 最富有客户的资产总量—2021/1/12

在这里插入图片描述

class Solution {
    public int maximumWealth(int[][] accounts) {
        int row = accounts.length;
        int col = accounts[0].length;
        int max = Integer.MIN_VALUE;
        for(int i=0;i<row;i++){
            int sum = 0;
            for(int j=0;j<col;j++){
                sum+=accounts[i][j];
                max = sum>max?sum:max; 
            }
        }
        return max;
    }
}

注: 统计每一行的最大值!!!!


十一.88. 合并两个有序数组----2021/1/13

在这里插入图片描述

class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        int length = m + n;
        int pointNum1 = m-1;
        int pointNum2 = n-1;
        int p = m + n -1;
        while(p>=0){
            if(pointNum1<0){
                nums1[p--] = nums2[pointNum2--];
                continue;
            }else if(pointNum2<0){
                nums1[p--] = nums1[pointNum1--];
                continue;
            }
            if(nums1[pointNum1]>=nums2[pointNum2]){
                nums1[p--] = nums1[pointNum1];
                pointNum1--;
            }
            else{
                nums1[p--] = nums2[pointNum2];
                pointNum2--;
            }
        }
    }
}

思路: 因为最后要比较的是num1数组(不需要开辟新的空间),所以这里需要从后往前走,这里结合双指针,谁大就保存谁的值,然后指针往前移,然后需要判断的是其中一个已经到头了,则剩下的值直接用另一个赋值即可(即包含continue的语句)。


十二.1534. 统计好三元组----2021/1/13

在这里插入图片描述

class Solution {
    public int countGoodTriplets(int[] arr, int a, int b, int c) {
        int count = 0;
        for(int i=0;i<arr.length-2;i++){
            for(int j = i+1;j<arr.length-1;j++){
                for(int k =j+1 ;k<arr.length;k++){
                    if(Math.abs(arr[i]-arr[j])<=a && Math.abs(arr[j]-arr[k])<=b && Math.abs(arr[i]-arr[k])<=c){
                        count++;
                    }
                }
            }
        }
        return count;
        
    }
}

思路: 三层for循环暴力解决!!!


还是开始做中等的吧,做简单的日常感觉自己好厉害!!(其实很菜)---一天只一道。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。