2018校招真题【牛客网】练习(五)

1、拼凑正方形

题目描述:
牛牛有4根木棍,长度分别为a,b,c,d。羊羊家提供改变木棍长度的服务,如果牛牛支付一个硬币就可以让一根木棍的长度加一或者减一。牛牛需要用这四根木棍拼凑一个正方形出来,牛牛最少需要支付多少硬币才能让这四根木棍拼凑出正方形。

思路:
在最长和最短间找一个长度,使之长度差最小。

代码:

import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        int a = scanner.nextInt();
        int b = scanner.nextInt();
        int c = scanner.nextInt();
        int d = scanner.nextInt();
        scanner.close();
        int maxlen = Math.max(Math.max((Math.max(a,b)),c),d);
        int minlen = Math.min(Math.min((Math.min(a,b)),c),d);
        int changeLength = Integer.MAX_VALUE;
        for(int side = minlen; side<=maxlen; side++){
            int totalChange = Math.abs(side-a)+Math.abs(side-b)
                +Math.abs(side-c)+Math.abs(side-d);
            changeLength = Math.min(totalChange,changeLength);
        }
        System.out.println(changeLength);
    }
}

2、区间表达

题目描述:
牛牛的老师给出了一个区间的定义:对于x ≤ y,[x, y]表示x到y之间(包括x和y)的所有连续整数集合。例如[3,3] = {3}, [4,7] = {4,5,6,7}.牛牛现在有一个长度为n的递增序列,牛牛想知道需要多少个区间并起来等于这个序列。
例如:
{1,2,3,4,5,6,7,8,9,10}最少只需要[1,10]这一个区间
{1,3,5,6,7}最少只需要[1,1],[3,3],[5,7]这三个区间

思路:
相邻两数如果差为1则不用开辟一个新区间,否则需要一个新区间。

代码:

import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int nums[] = new int[n];
        for(int i=0;i<n;i++){
            nums[i] = scanner.nextInt();
        }
        int count = 1;
        for(int i=1;i<n;i++){
            if(nums[i]-nums[i-1]==1){
                continue;
            }else{
                count++;
            }
        }
        System.out.println(count);
    }
}

3、数字游戏

题目描述:
牛牛举办了一场数字游戏,有n个玩家参加这个游戏,游戏开始每个玩家选定一个数,然后将这个数写在纸上(十进制数,无前缀零),然后接下来对于每一个数字将其数位按照非递减顺序排列,得到新的数,新数的前缀零将被忽略。得到最大数字的玩家赢得这个游戏。

思路:
把每个数重排,取最大的那个。

代码:

import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int maxNum = Integer.MIN_VALUE;
        for(int i=0;i<n;i++){
            String str = scanner.nextInt()+"";
            str = sort(str);
            int sortedNum = Integer.parseInt(str);
            maxNum = Math.max(maxNum,sortedNum);
        }
        System.out.println(maxNum);
    }
    public static String sort(String str){
        char[] c = str.toCharArray();
        for(int i=0;i<c.length-1;i++){
            for(int j=i+1;j<c.length;j++){
                if(c[i]>c[j]){
                    char temp = c[i];
                    c[i] = c[j];
                    c[j] = temp;
                }
            }
        }
        String result = "";
        for(int i=0;i<c.length;i++){
            result += c[i];
        }
        return result;
    }
}

4、红和绿

题目描述:
牛牛有一些排成一行的正方形。每个正方形已经被染成红色或者绿色。牛牛现在可以选择任意一个正方形然后用这两种颜色的任意一种进行染色,这个正方形的颜色将会被覆盖。牛牛的目标是在完成染色之后,每个红色R都比每个绿色G距离最左侧近。牛牛想知道他最少需要涂染几个正方形。
如样例所示: s = RGRGR
我们涂染之后变成RRRGG满足要求了,涂染的个数为2,没有比这个更好的涂染方案。

思路:(参考讨论)
只需要遍历一次数组,在当前位置为R时有可能两种情况,一种是吧这个位置编程G,另一种是吧前面的G全部变成R.

代码:

import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        char[] str = scanner.nextLine().toCharArray();
        scanner.close();
        int count = 0;
        int gcount = 0;
        for(int i=0;i<str.length;i++){
            if(str[i]=='G'){
                gcount++;
            }else{
                count = Math.min(gcount,count+1);
            }
        }
        System.out.println(count);
    }
}

5、拼凑三角形

题目描述
牛牛手中有三根木棍,长度分别是a,b,c。牛牛可以把任一一根木棍长度削短,牛牛的目标是让这三根木棍构成一个三角形,并且牛牛还希望这个三角形的周长越大越好。

代码:

import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        ArrayList<Integer> sides = new ArrayList<>();
        for(int i=0;i<3;i++){
            sides.add(scanner.nextInt());
        }
        Collections.sort(sides);
        if(sides.get(0)+sides.get(1)>sides.get(2)){
            System.out.println(sides.get(0)+sides.get(1)+sides.get(2));
        }else{
            System.out.println(sides.get(0)+sides.get(1)+
                              sides.get(0)+sides.get(1)-1);
        }
    }
}

猜你喜欢

转载自blog.csdn.net/xiaowei_innocence/article/details/88405305