一 解方程(简单)
给定一个一元二次方程 ax2+bx+c=0,保证给定方程有解,且恰好有两个不同的实数根。
请你对该方程进行求解。
一元二次方程求根公式为:
输入格式
共一行,包含三个整数 a,b,c。
输出格式
共两行,第一行输出较大的根,第二行输出较小的根。
结果保留六位小数。
数据范围
所有测试点满足 −1000≤a,b,c≤1000,保证给定方程有解,且恰好有两个不同的实数根。
输入样例:
1 30 200
输出样例:
-10.000000
-20.000000
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
int a,b,c;
a=in.nextInt();
b=in.nextInt();
c=in.nextInt();
double max,min;
max=((Math.sqrt(Math.pow(b,2)-4*a*c))-b)*1.0/(2*a);
min=((Math.sqrt(Math.pow(b,2)-4*a*c))+b)*(-1.0)/(2*a);
System.out.println(String.format("%.6f",Math.max(max,min)));
System.out.println(String.format("%.6f",Math.min(min,max)));
}
}
总结
101周的打卡题,但直播时y总说比之前的正确率低了一些。这题掌握Math的基本函数和小数位的处理即可。
二 栈(中等)
给定一个栈,初始时栈为空。
你需要依次进行 n 个操作。
每个操作给定一个由小写字母构成的非空字符串,随后进行判断:
- 如果栈中已经包含该字符串,则将该字符串上升至栈顶,栈中其它元素的相对顺序保持不变。
- 如果栈中还未包含该字符串,则将该字符串直接插入到栈的顶部。
所有操作完成后,请你按照从栈顶到栈底的顺序,依次输出栈内所有元素。
输入格式
第一行包含整数 n。
接下来 n 行,每行包含一个由小写字母构成的非空字符串。
输出格式
按照从栈顶到栈底的顺序,依次输出栈内所有元素。
每个元素占一行。
数据范围
前 5 个测试点满足 1≤n≤10。
所有测试点满足 1≤n≤2×10e5,每个给定字符串的长度范围 [1,10]。
输入样例1:
4
apple
pear
banana
pear
输出样例1:
pear
banana
apple
输入样例2:
8
pen
book
eraser
desk
desk
eraser
book
pen
输出样例2:
pen
book
eraser
desk
import java.util.HashSet;
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner in=new Scanner(System.in);
HashSet<String> hs=new HashSet<>();
int n=in.nextInt();
String[] arr=new String[n];
for(int i=0;i<n;i++){
arr[i]=in.next();
}
String[] res=new String[n];
int index=0;
for(int i=n-1;i>=0;i--){
if(hs.contains(arr[i])){
continue;
}
hs.add(arr[i]);
res[index++]=arr[i];
}
for(int i=0;i< index;i++){
System.out.println(res[i]);
}
}
}
总结
此题为模拟一个栈,利用java中有的集合来操作会更简单。首先你需要知道是需要进行去重操作的,从前往后入栈的话,达不到我们想要的指定位该单词出现的最后位置,所以我们需要逆向思维。我们需要两个字符串数组来进行操作,还需要一个HashSet的集合对象即可完成题目
三 或运算(简单)
给定两个长度为 n 的整数序列 a1,a2,…,an 以及 b1,b2,…,bn。
设 A=a1 or a2 or … or an,B=b1 or b2 or … or bn。
请你计算并输出 A+B 的值。
oror 表示按位或运算。
输入格式
第一行包含整数 n。
第二行包含 n 个整数 a1,a2,…,an。
第三行包含 n 个整数 b1,b2,…,bn。
输出格式
一个整数,表示 A+B 的值。
数据范围
前 33 个测试点满足 1≤n≤10。
所有测试点满足 1≤n≤1000,0≤ai,bi≤10e9。
输入样例1:
5
1 2 4 3 2
2 3 3 12 1
输出样例1:
22
输入样例2:
10
13 2 7 11 8 4 9 8 5 1
5 7 18 9 2 3 0 11 8 6
输出样例2:
46
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner in=new Scanner(System.in);
int n=in.nextInt();
int[] arr1=new int[n];
int[] arr2=new int[n];
for(int i=0;i<n;i++){
arr1[i]=in.nextInt();
}
for(int i=0;i<n;i++){
arr2[i]=in.nextInt();
}
long sum1=0,sum2=0;
for(int i=0;i<n;i++){
sum1=sum1|arr1[i];
sum2=sum2|arr2[i];
}
System.out.println(sum1+sum2);
}
}
总结
此题只需要明白什么是或运算即可,可以开展一下|,&的含义,底层是数字变成二进制的操作。
四 倍增(中等)
给定一个长度为 n 的整数序列 a1,a2,…,an。
你可以对该序列进行任意次倍增操作(也可以不进行任何操作)。
每次倍增操作可以任选序列中的一个元素,并将其乘以 2 或乘以 3。
我们的目标是让序列中所有元素的值都相等。
请你判断,目标是否能够实现。
输入格式
第一行包含整数 n。
第二行包含 n个整数 a1,a2,…,an。
输出格式
如果可以让序列中所有元素的值都相等,则输出 Yes
,否则,输出 No
。
数据范围
前 6个测试点满足 2≤n≤10。
所有测试点满足 2≤n≤10e5,1≤ai≤10e9。
输入样例1:
4
75 150 75 50
输出样例1:
Yes
输入样例2:
3
100 150 250
输出样例2:
No
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner in=new Scanner(System.in);
int n=in.nextInt();
long[] arr=new long[n];
for(int i=0;i<n;i++){
arr[i]=in.nextLong();
while(arr[i]%2==0){
arr[i]/=2;
}
while(arr[i]%3==0){
arr[i]/=3;
}
}
boolean key=true;
for(int i=1;i<n;i++){
if(arr[i]!=arr[i-1]){
key=false;
break;
}
}
String res=key?"Yes":"No";
System.out.println(res);
}
}
总结
有点偏数论了,当时我是想着找最大值,然后往上开几次,结果只能过16/20个数据。后来想了想应该只能往下开,即找出除了2,3的坤质数后比较即可。往上开是没有上线的,可往下开是有下线的