宇信科技笔试 - 1012
宇信科技笔试 - 1012
第一题
题面
小红和小紫在玩一个游戏,在这个游戏中,小红坐标为 ,小紫坐标为 ,游戏开始时,小紫以 的速度沿 轴方向向右行走,小红向坐标 (,) 发射了一个速度为 的魔法水晶箭,魔法水晶箭到达坐标 (,) 时会爆炸,对以落点为圆心、半径为 的区域造成范围伤害。
如果小紫中途不更改行进方向和速度,请你计算小紫是否会被魔法水晶箭攻击到?
输入描述:
本题为多组测试数据,第一行输入一个正整数 ,代表测试数据组数。
对于每组测试数据,一行输入五个正整数 , ,含义如题所述。
输出描述:
对于每组测试数据输出一行答案,如果小紫会被魔法水晶箭攻击到,则输出 "Yes",否则输出 "No"。
示例:
输入:1
1 1 1 1 1
输出:Yes
思路与代码:
计算魔法水晶箭从发射到落地的时间,判断小紫在落地的时刻是否在魔法水晶箭的爆炸范围内即可。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
for (int i = 0; i < T; i++) {
int h = scanner.nextInt();
int r = scanner.nextInt();
int x0 = scanner.nextInt();
int v1 = scanner.nextInt();
int v2 = scanner.nextInt();
double t = Math.sqrt(x0 * x0 + h * h) / v2;
double d = v1 * t;
if (d >= x0 - r && d <= x0 + r) {
System.out.println("Yes");
} else {
System.out.println("No");
}
}
}
}
第二题
题面
从 C/C++ 转到 Java 的程序员,一开始最不习惯的就是变量命名方式的改变。C 语言风格使用下划线分隔多个单词,例如 "hello_world";而 Java 则采用一种叫骆驼命名法的规则:除首个单词以外,所有单词的首字母大写,例如 "helloWorld"。
请你帮 C 程序员们自动转换变量名。
输入描述:
每组数据一行,包含一个 C 语言风格的变量名。每个变量名长度不超过 。
输出描述:
输出变量名相应的骆驼命名法。
示例:
输入:hello_world
输出:helloWorld
思路与代码:
遍历变量名中的每一个字符:
- 如果当前字符是下划线
_
,则跳过该字符,并将下一个字符转换为大写。 - 如果当前字符不是下划线,则直接添加到结果字符串中。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
StringBuilder res = new StringBuilder();
boolean next = false;
for (char c : str.toCharArray()) {
if (c == '_') {
next = true;
} else {
if (next) {
res.append(Character.toUpperCase(c));
next = false;
} else {
res.append(c);
}
}
}
System.out.println(res.toString());
}
}
第三题
题面
将自然数 ~ 写成一排,还有另一个自然数 。
删数游戏每一轮删除位置编号为 的倍数上的数字,删掉后空出来的地方由后面的数字递补,一直删到剩余的数字个数少于 个,这样就不能再继续下去了。
请问在第几轮的时候数字 被删除?
例如对于 的时候,删除情况如下:
第一轮删除了 ,剩下 。
第二轮删除了 ,剩下 。
第三轮删除了 ,剩下 。
第四轮删除了 ,剩下 。
剩余数字个数小于 个,游戏结束,共进行了 轮,数字 在第三轮被删除。
输入描述:
在两行中给出两个正整数 ,含义如题所示
输出描述:
在一行中输出数字 在第几轮被删除,如果数字 不会被删除则输出
示例:
输入:13 2
输出:3
思路与代码:
约瑟夫环的变种问题。
为了确定数字 在第几轮被删除,可以跟踪 在每一轮中的位置。在每一轮中,每隔 个数删除第 个数。如果 的位置是 的倍数,则它将在当前轮被删除。否则,更新 的新位置为原位置减去被删除的数的数量,然后进入下一轮。
重复此过程,直到剩余的数字少于 个。如果在所有轮次中 未被删除,则输出 。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
long n = sc.nextLong();
int k = sc.nextInt();
long round = 1;
long pos = n;
while (true) {
if (pos % k == 0) {
System.out.println(round);
return;
}
long del = pos / k;
pos = pos - del;
if (pos < k) {
break;
}
round++;
}
System.out.println(0);
}
}