笔试训练(3)

1)结构化程序的设计原则:模块化,自项向下,逐步求精

2)下列程序的输出结果是:0

public class Task {
    static int i;
    public static void main(String[] args) {
        System.out.println(i);
    }
}

3)下列程序的输出结果是:1和1.0

 public static void main(String[] args) {
       System.out.println(100/3);
       System.out.println(100/3.0);
    }

4)在JAVA基本类型中,小数默认是double类型,如果我们写float a=1.0,此时程序就会报错,因为默认是double类型,我们应该写成float a=1.0f;

5)方法通常存储在JVM中的方法区

编程题1:组队竞赛组队竞赛_牛客笔试题_niu

题目大概叙述:牛牛举办了一次编程比赛,参加比赛的有3*n个选手,每一个选手都有一个水平值a_i,现在要把这些选手进行组队,一共组成N个队伍,即每一个队伍3个人,牛牛发现队伍的水平值等于该队伍队员的第二水平值
例如:
一个队伍三个队员的水平值分别是3,3,3.那么队伍的水平值是3
一个队伍三个队员的水平值分别是3,2,3.那么队伍的水平值是3
一个队伍三个队员的水平值分别是1,5,2.那么队伍的水平值是2
为了让比赛更有看点,牛牛想安排队伍使所有队伍的水平值总和最大。
如样例所示:
如果牛牛把6个队员划分到两个队伍
如果方案为:
team1:{1,2,5}, team2:{5,5,8}, 这时候水平值总和为7.
而如果方案为:
team1:{2,5,8}, team2:{1,5,5}, 这时候水平值总和为10.
没有比总和为10更大的方案,所以输出10.

思路:

1)对于1,2,5,5,5,8这个数组来说,我们该如何进行分组呢?总共数组的长度是9

我们取第一个元素和倒数后两个元素:1,5,8(0下标取的位置是4)

我们取第二个元素所取得元素下标是:2,5,5(1下标取的位置是2)

2)对于2,5,1,4,3,7,6,9,8这个数组来说,总共数组的长度是9,我们先给数组进行排序:1,2,3,4,5,6,7,8,9

我们取第一个元素和倒数后两个元素:1,8,9(0号位置下标开始取得位置下标是7)

我们取第二个元素所取得元素下标是:2,7,8(1号位置下标开始取得的位置下标是5)

我们取第三个元素所取得元素下表是:3,4,5(2号位置下标开始取得的位置下标是4)

1)所以说我们定义一个循环,循环所走的次数也就是分组所分的次数也就是len/3

2)既然循环从前向后走,每走到一个位置,对应的元素下标是array.len-2*(i+1)

import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner scanner=new Scanner(System.in);
        while(scanner.hasNextInt()){
        int n=scanner.nextInt();
        int[] array=new int[3*n];
        for(int i=0;i<3*n;i++){
            array[i]=scanner.nextInt();
        }
        Arrays.sort(array);
        long sum=0;
        for(int i=0;i<n;i++){
            sum=sum+array[(array.length-2*(i+1))];
        }
        System.out.println(sum);
     }
     }
}

编程题第二题:删除公共字符

第一种方法:通过hashSet来进行解决:

import java.util.Scanner;
import java.util.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        while(scanner.hasNext()){
            String str1=scanner.nextLine();
            String str2=scanner.nextLine();
            HashSet<Character> result=new HashSet<>();
            for(int i=0;i<str2.length();i++){
                char ch=str2.charAt(i);
                     result.add(ch);
            }
            StringBuilder builder=new StringBuilder();
            for(int j=0;j<str1.length();j++){
                      char ch=str1.charAt(j);
                      if(!result.contains(ch)){
                         builder.append(ch);
                      }
            }
            System.out.print(builder);
      }
    }
}

第二种方法:也是一种哈希映射

输入用例:

a,b,c,d,e,f

b,e

输出用例:

a,c,d,f

1)由于小写字母a的ASCIL码值是97,我们可以申请一个数组长度大小是256的数组,遍历第二个字符串,把对应的字符出现的次数放到数组里面

2)遍历第一个字符串如果说在数组中的值是0,那么说明这个字符在第二个字符串中没有出现过

 public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        String str1=scanner.nextLine();
        String str2=scanner.nextLine();
       int[] array=new int[256];
       for(int i=0;i<str2.length();i++){
           char ch=str2.charAt(i);
            array[ch]++;
        }
        StringBuilder builder=new StringBuilder();
        for(int i=0;i<str1.length();i++){
            char ch=str1.charAt(i);
            if(array[ch]==0){
                builder.append(ch);
            }
        }
        System.out.println(builder);
    }

第三种方法:使用哈希表存储每一个字符出现的次数

1)先进行创建一个HashMap统计第二个字符串,记录每一个字符出现的次数

2)遍历第一个字符串中的所有字符,如果在hashMap中找不到,说明这个字符在字符串2中没有出现过

public class Main {
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        String str1=scanner.nextLine();
        String str2=scanner.nextLine();
        HashMap<Character,Integer> result=new HashMap<>();
        for(int i=0;i<str2.length();i++){
            char ch=str2.charAt(i);
            if(!result.containsKey(ch)){
                result.put(ch,1);
            }else{
                int count=result.get(ch);
                result.put(ch,count++);
            }
        }
        StringBuilder builder=new StringBuilder();
        for(int i=0;i<str1.length();i++){
            char ch=str1.charAt(i);
            if(!result.containsKey(ch)){
                  builder.append(ch);
            }
        }
        System.out.println(builder);
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值