思路:这一题没有看懂是要挑选出成绩峰值最大的5个人,还是根据平均值选出5个人求其峰值和;
第一种情况答案是490
第二种情况没算
我考试时没有看清题意,以为是求出这几组数据的最大值,成功避开了题意,所以第一题就很随意的凉凉了~~
思路:
截取所有可能的字符串放入hashmap中,
hashmap的特点就是:如果有重复的字符串会覆盖之前的字符串,
最后利用map.size求出集合中字符串的个数
我的答案是100
代码:
import java.util.HashMap;
public class Main {
public static void main(String[] args) {
String s = "0100110001010001";
// String s = "abcd";
HashMap map = new HashMap<>();
for (int i = 0; i <= s.length(); i++) {
for (int j = i+1; j <= s.length(); j++) {
map.put(s.substring(i, j), 1);
}
}
System.out.println(map.size());
}
}
思路:这道题有两种方法,递推和递归,但是递归20190324数字太大,会出现栈溢出,所以只能用递推来做
我的答案是:4659
代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int a = 1,b = 1,c = 1;
for (int i = 4; i <= n; i++) {
int temp = (a + b + c)%100000;//为了防止超过最大整数,可以对100000取余
a = b%100000;
b = c%100000;
c = temp;
}
System.out.println(c);
}
}
思路:全排列,每一种情况都存起来
个人觉得正确答案是:40785
然而我又成功避开了正确答案,考试的时候写的是299,因为最后做的这道题,所以没有认真看,忽略了题目中“”各不相同“”四个字,真是道路千万条,我非得走有坑的那一条。。。。。。。。。
代码:
public class Main {
public static void main(String[] args) {
int n = 2019;
int t = 0;
loop:for (int i = 1; i < n; i++) {
if((i+"").indexOf("2")!=-1||(i+"").indexOf("4")!=-1)
continue;
loop2:for (int j = i+1; j < n; j++) {
if(i==j)
continue loop2;
if((j+"").indexOf("2")!=-1||(j+"").indexOf("4")!=-1)
continue;
int k = n-i-j;
if(k<=0)
break loop2;
if(i==k)
continue loop2;
if(j==k)
continue loop2;
if((k+"").indexOf("2")!=-1||(k+"").indexOf("4")!=-1)
continue loop2;
t++;
}
}
System.out.println(t/3);
}
}
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
long n = sc.nextInt();
long num = 0;
for (int i = 1; i <= n; i++) {
String s = i + "";
if(s.indexOf("2")!=-1||s.indexOf("0")!=-1||s.indexOf("1")!=-1||s.indexOf("9")!=-1)
num += i;
}
System.out.println(num);
}
}
思路:用二维数组a[N+1][T+1]存放订单数量,例如上面的测试例子,用二维数组(行表示时间点,列表示店铺编号)表示为:
1 | 2 | 3 | 4 | 5 | 6 | |
1 | 1 | 1 | 1 | 0 | 0 | 0 |
2 | 0 | 0 | 0 | 0 | 1 | 2 |
然后用一个一维数组sum[N+1]存放每个店铺的优先级,如下表(行代表时间点):
1 | 2 | 3 | 4 | 5 | 6 | |
sum[1] | 2 | 4 | 6 | 5 | 4 | 3 |
sum[2] | 0 | 0 | 0 | 0 | 2 | 6 |
缓存中店铺数量 | 0 | 0 | 1 | 1 | 1 | 1 |
import java.util.HashMap;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int order = sc.nextInt();
int time = sc.nextInt();
int a[][] = new int[n+1][time+1];
int sum[] = new int[n+1];
HashMap map = new HashMap<>();
for (int i = 0; i < order; i++) {
int ts = sc.nextInt();
int id = sc.nextInt();
if(ts<=time)
a[id][ts]++;
}
for (int i = 1; i < n+1; i++) {
for (int j = 1; j < time+1; j++) {
if(a[i][j]==0)
sum[i] = Math.max(0, sum[i]-1);
else
sum[i] += a[i][j]*2;
if(sum[i]>5)
map.put(i, 1);
if(sum[i]<=3&&map.containsKey(i))
map.remove(i);
}
}
System.out.println(map.size());
}
}
思路:不管有几个减号,只要m>0,结果都为所有数相加,减去最小值的二倍;
e.g 有四个减号的表达式:a-(b-c-d-e),其实只是减了一个数b。只需要把最小的那个数给b就行了。
坑1:
可能你看了上面的表达式有所疑问,题目中没有说有括号啊,你怎么能用括号呢?这叫要说说什么是后缀表达式了,在表达式转为后缀表达式的时候,括号是被抵消了,不会出现在最后的结果中。如果还不理解,可以查看有关后缀表达式的详细介绍,在这里就不多说了。
坑2:
题目中的数组范围是:如果有200000个10^9相加会超过整数的表示范围,所以我用了大数处理,不知道会不会超时。。。
代码:
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
BigInteger min = new BigInteger("1000000000");
BigInteger sum = new BigInteger("0");
int num = n + m + 1;
for (int i = 0; i < num; i++) {
BigInteger temp = new BigInteger(sc.nextInt()+"");
sum = sum.add(temp);
min = temp.compareTo(min)==-1?temp:min;
}
System.out.println(sum.subtract(min.multiply(new BigInteger("2"))));
}
}