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); } }