这是某某某些大厂的笔试算法题,正在刷题的朋友们了解了解它与力扣上面的算法题的区别呀~ 要是有大佬顺便评论区帮帮就太好了~小菜鸟在线感激不尽~
230313某某某厂三
第一题
描述:小红拿到了一个字符串,她想知道这个字符串能否通过重新排列组成"Loveu"字符串?
注:必须大小写完全相同,共有 t 组询问。
输入描述:第一行输入一个正整数t,代表询问次数;接下来的t行.每行输入一个仅包含英文字母的字符串,所有字符串的长度之和保证不超过200000。
输出描述:对于每次询问,输出一行答案。如果可以通过重新排列组成"Loveu",则输出"Yes “,否则输出"No”
输入示例:
4
Loveu
loveu
Loveu
oove
输出示例:
Yes
No
Yes
No
第二题
描述:小红拿到了一棵树,每个节点被染成了红色或者蓝色。小红定义每条边的权值为:删除这条边时,形成的两个子树的同色连通块数量之差的绝对值。小红想知道,所有边的权值之和是多少?
输入描述:第一行输入一个正整数 n,代表节点的数量。第二行输入一个长度为 n 且仅由 ‘R’ 和 ‘B’ 两种字符组成的字符串。第 i 个宇符为 ‘R’ 代表 i 号节点被染成红色,为 ‘B’ 则被染成蓝色。
接下来的 n-1行,每行输入两个正整数 u 和 v,代表节点 u 和节点 v 有一条边相连.
1 <= n <= 200000
输出描述:一个正整数,代表所有节点的权值之和。
输入示例:
4
BBRR
1 2
3 2
4 1
第三题
描述:给定一个整数 x,请你构造一个仅由 ‘r’、"e’、‘d’ 三种字符组成的字符串,其中回文子串的数量恰好为 x。宇符串的长度不得超过10^5。
输入描述:一个正整数 x,1 <= x <= 10^9
输出描述:输出一个仅由 ‘r’、"e’、‘d’ 三种字符组成的字符串,长度不得超过10^5。有多解时输出任意即可。
输入示例:
3
输出示例:
red
说明:输出 ‘‘dd’’ 也是可以通过的
230307某某某厂二
第一题
前提:定义一个数组为“稳定的”,当且仅当数组相邻的两个元素之差的绝对值不超过1。
示例: [2 3 2 2 1] 是稳定的,而 [1 3 2] 不是稳定的。
问题:现在拿到一个数组,想要求出该数组的最长的“稳定的”连续子数组的长度。
输入描述:
- 第一行输入一个正整数 n,代表数组的大小
- 第二行输入 n 个正整数,代表数组的元素
- 1 <= n <= 100000
- 1 <= ai <=10的9次方
输出描述:
- 一个正整数,代表最长连续稳定子数组的长度
第二题
前提:一个长度为 n 的字符串,每一次操作会选择一个区间 [l, r] ,然后将第 l 个字母到第 r 个字母各重复一次,插入到该字母的后面。
示例:对于字符串 “abcd”,若选择区间 [2, 3] 进行操作,字符串将变成 “abbccd”。
问题:如果进行 q 次操作,那操作结束后,最终字符串是什么样子?
输入描述:
- 第一行输入两个正整数 n 和 q,分别代表字符串的长度和操作次数。
- 第二行输入一个仅由小写英文字母组成的字符串,代表初始的字符串。
- 1 <= n <= 1000
- 1 <= q <= 10
- 1 <= l <= r <=10的6次方
- 保证每次操作时,r 不大于当前的字符串长度
输出描述:
- 一个字符串,代表所有操作结束后形成的字符串
第三题
描述:某某某准备开车出游,他的车比较特殊,油越多则最高速度越快,即最高速度与油量成正比。另外,行驶过程中油是不会消耗的。
前提:已知车的初始最高速度为 v0,当花费 t 时间加油时,车的最高速度会变成 v0 + t * x。
问题:开车的总里程为 y,假设始终以最高速度行驶(即忽略加速时间),那最少花费多少时间可以完成出行?
输入描述:
- 三个整数 v0,x,y,用空格隔开
- 1 <= v0 <=10的9次方
- 1 <= x,y <=10的9次方
输出描述:
- 一个浮点数,代表最终花费的总时间
230312某某某厂一
public class Testing0312 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
/*第一题的输入*/
// String s = sc.nextLine();
/*测试第一题 用例完全AC*/
// System.out.println(operate1(s));
/*第二题的输入*/
/*int t = sc.nextInt();
int n = sc.nextInt();
int[][] arr = new int[t][n];
for(int i = 0; i < t; i++){
for(int j = 0; j < n; j++){
arr[i][j] = sc.nextInt();
}
}*/
/*测试第二题 用例完全AC*/
/*int[] res = operate2(t, n, arr);
for (int r: res) {
System.out.println(r);
}*/
/*第四题的输入*/
int n4 = sc.nextInt();
int[] arr4 = new int[n4];
for(int i = 0; i < n4; i++){
arr4[i] = sc.nextInt();
}
/*测试第四题 没有完全AC*/
Long[][] res4 = operate3(n4, arr4);
for(int i = 0; i < 2; i++){
for(int j = 0; j < n4; j++){
System.out.print(res4[i][j]+" ");
}
System.out.println();
}
}
/*第一题函数*/
/*题目要求就是根据输入的字符串,按照一定的要求输出期望字符串
*示例:
* 输入:10A2B3C
* 输出:AAAAAAAAAABBCCC
* */
public static String operate1(String s){
char[] arr = s.toCharArray();
//StringBuffer是可变的,用于拼接最终的字符串
StringBuffer res = new StringBuffer();
//用于记录某个字符前的数字,该数字可能是多位的所以需要用到字符串拼接
StringBuffer count = new StringBuffer();
for(int i = 0; i < arr.length; i++){
if(arr[i] >= '0' && arr[i] <= '9'){
count.append(arr[i]);
}else{
//程序走到这里,说明当前字符是一个字母,该字母前的数字拼接完成,该循环该字母了
int num = Integer.parseInt(count.toString());
for(int j = 0; j < num; j++){
res.append(arr[i]);
}
//清空记录数字的串
count.delete(0, count.length());
}
}
return res.toString();
}
/*第二题函数*/
/*题目要求是模拟打飞机游戏,A键一次可以消灭两个血量为1的 敌机,B键一次可以消灭一个任意血量的敌机
*输入:
* 第一行两个整数:关卡数 敌机数
* 有多少关卡就输出几行,有多少敌机就输入多少列
*输出:有多少关卡,就输出几行,每行输出该关卡最少按几次键可以消灭所有的敌人
*示例:
* 输入: 3 3
* 1 2 1
* 1 2 3
* 1 3 2
* 输出: 2
* 3
* 3
* */
public static int[] operate2(int t, int n, int[][] arr){
int[] res = new int[t];
for(int i = 0; i < t; i++){
int count = 0, result = 0;
for(int j = 0; j < n; j++){
//首先统计当前关卡血量为1的敌机的数量,用count变量记录
if(arr[i][j] == 1){
count++;
}
}
//如果该关卡血量为1的敌机数量为偶数,
// 那么A键就按(count/2)次,B键按的次数就是剩余血量不为1的敌机数量
if(count % 2 == 0){
result = count /2 + (n - count);
}else{
//如果该关卡血量为1的敌机数量为奇数
// 那么A键就按(count/2)次,B键按的次数就是剩余血量不为1的敌机数量
// 因为还有一个血量为1的敌机,所以无论是按A还是B都得再按一次
result = count /2 + (n - count) + 1;
}
res[i] = result;
}
return res;
}
/*第四题函数*/
/*题目给出一个数组,表示某餐厅每一天的客流量,现在要求计算出第i天的平均客流量和第i天客流量的中位数
*输入:
* 第一行一个整数:记录了餐厅多少天的客流量
* 第二行一个数组:对应餐厅每天的客流量
*输出:
* 第一行一个数组:第i天餐厅客流量的平均数,平均数四舍五入
* 第二行一个数组:第i天餐厅客流量的中位数
*示例:
* 输入: 5
* 1 2 3 4 10
* 输出: 1 2 2 3 4
* 1 2 2 3 3
* 注意:这道题有取值范围要求,记不得了,选用Int、Long数组实现都不会完全AC,可惜记不得具体要求了
* */
public static Long[][] operate3(int n, int[] arr){
Long[][] dp = new Long[2][n];
dp[0][0] = (long)arr[0];
dp[1][0] = (long)arr[0];
//求平均
for(int i = 1; i < n; i++){
double sum = 0.0;
for(int j = 0; j <= i; j++){
sum += arr[j];
}
dp[0][i] = Math.round(sum / (i+1));//四舍五入
}
//求中位数
for(int i = 1; i < n; i++){
int[] temp = new int[i + 1];
for(int j = 0; j <=i; j++){
temp[j] = arr[j];
}
//保证数组是升序的
Arrays.sort(temp);
if(i % 2 == 0){
dp[1][i] = (long)(temp[i / 2] + temp[i / 2 + 1]) / 2;
}else{
dp[1][i] = (long)temp[(i-1) / 2 + 1];
}
}
return dp;
}
}