测试开发备战秋招面试18-牛客刷题之贪心+模拟

本文展示了几个使用Java解决的算法问题,包括分糖果问题、主持人调度、旋转数组、螺旋矩阵和顺时针矩阵旋转。这些问题涉及到数组初始化、比较逻辑、排序以及矩阵操作等技巧。
摘要由CSDN通过智能技术生成

努力了那么多年,回头一望,几乎全是漫长的挫折和煎熬。对于大多数人的一生来说,顺风顺水只是偶尔,挫折、不堪、焦虑和迷茫才是主旋律。我们登上并非我们所选择的舞台,演出并非我们所选择的剧本。继续加油吧!

目录

1、分糖果问题

2、主持人调度(二)

3、旋转数组

4、螺旋矩阵

5、顺时针矩阵旋转


1、分糖果问题

题目链接:分糖果问题_牛客题霸_牛客网

思路:主要就是满足两个条件,初始化数组元素为1,满足第一个,对于第二个条件,则从作到右和从右到左两轮循环,保证相邻大的分的糖果多,即比左右两个分的都多。

Java版:

import java.util.*;


public class Solution {
    /**
     * pick candy
     * @param arr int整型一维数组 the array
     * @return int整型
     */
    public int candy (int[] arr) {
        // write code here
        if(arr.length == 1){
            return 1 ;
        }
        int [] candy = new int [arr.length]  ;
        Arrays.fill(candy, 1) ;
        for(int i=1; i<arr.length; i++){
            if(arr[i-1] < arr[i]){
                candy[i] = candy[i-1] + 1 ;
            }
        }
        for(int i=arr.length-1; i>0; i--){
            if(arr[i-1] > arr[i]){
                candy[i-1] = Math.max(candy[i-1],candy[i] + 1) ;
            }
        }
        int ans = 0 ;
        for(int s : candy){
            ans += s ;
        }
        return ans ;
    }
}

2、主持人调度(二)

题目链接:主持人调度(二)_牛客题霸_牛客网
思路:定义两个数组,记录开始时间和结束时间,先排序,然后排序,若下一次开始时间大于当前结束时间则不需要增加主持人,否则需要增加一个主持人。

Java版:

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 计算成功举办活动需要多少名主持人
     * @param n int整型 有n个活动
     * @param startEnd int整型二维数组 startEnd[i][0]用于表示第i个活动的开始时间,startEnd[i][1]表示第i个活动的结束时间
     * @return int整型
     */
    public int minmumNumberOfHost (int n, int[][] startEnd) {
        // write code here
        int [] s = new int [n] ;
        int [] e = new int [n] ;
        for(int i=0; i<n; i++){
            s[i] = startEnd[i][0] ;
            e[i] = startEnd[i][1] ;
        }
        Arrays.sort(s) ;
        Arrays.sort(e) ; 
        int ans = 0 ;
        int j = 0 ;
        for(int i=0; i<n; i++){
            if(s[i] >= e[j]){
                j ++ ;
            }else{
                ans ++ ;
            }
        }
        return ans ;

    }
}

3、旋转数组

题目链接:旋转数组_牛客题霸_牛客网

思路:三次翻转可以模拟数组的旋转,注意m可能比n大,所以要取余。

Java版:

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 旋转数组
     * @param n int整型 数组长度
     * @param m int整型 右移距离
     * @param a int整型一维数组 给定数组
     * @return int整型一维数组
     */
    public int[] solve (int n, int m, int[] a) {
        // write code here
        m = m % n ;
        reverse(a,0,n-1) ;
        reverse(a,0,m-1) ;
        reverse(a,m,n-1) ;
        return a ;
    }
    public void reverse(int [] a, int left, int right){
        while(left<right){
            int tmp = a[left] ;
            a[left] = a[right] ;
            a[right] = tmp ;
            left ++ ;
            right -- ;
        }
    }
}

4、螺旋矩阵

题目链接:螺旋矩阵_牛客题霸_牛客网

思路:定义上下左右四个角,然后然后模拟走四个边,依次存入集合即可。

Java版:

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param matrix int整型二维数组 
     * @return int整型ArrayList
     */
    public ArrayList<Integer> spiralOrder (int[][] matrix) {
        // write code here
        ArrayList<Integer> list = new ArrayList<>() ;
        if(matrix.length == 0){
            return list ;
        }
        int top = 0 ;
        int bottom = matrix.length - 1;
        int left = 0 ;
        int right = matrix[0].length - 1;

        while(true){
            for(int i=left; i<=right; i++){
                list.add(matrix[top][i]) ;
            }
            top ++ ;
            if(top>bottom){
                break ;
            }
            for(int i=top; i<=bottom; i++){
                list.add(matrix[i][right]) ;
            }
            right -- ;
            if(right < left){
                break ;
            }
            for(int i=right; i>=left; i--){
                list.add(matrix[bottom][i]) ;
            }
            bottom -- ;
            if(bottom < top){
                break ;
            }
            for(int i=bottom; i>=top; i--){
                list.add(matrix[i][left]) ;
            }
            left ++ ;
            if(left > right){
                break ;
            }
        }
        return list ;
    }
}

5、顺时针矩阵旋转

题目链接:顺时针旋转矩阵_牛客题霸_牛客网

思路:可以开辟一个新数组,找到旋转前后的下标映射关系。也可以直接在原数组上对角线元素交换,再上下或者左右元素交换模拟翻转。

Java版:

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param mat int整型二维数组 
     * @param n int整型 
     * @return int整型二维数组
     */
    public int[][] rotateMatrix (int[][] mat, int n) {
        // write code here
        int [][] ans = new int [n][n] ;
        for(int i=0; i<n; i++){
            for(int j=0; j<n; j++){
                ans[j][n-i-1] = mat[i][j] ;
            }
        }
        return ans ;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nuist__NJUPT

给个鼓励吧,谢谢你

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值