2023.3.29 练习携程一轮3.7笔试题(牛客找的,附本人部分题解)+3.29二轮笔试题(亲自考的)
一轮3.7笔试题
Q1
数组后一个数与前一个数差值的绝对值小于1则为稳定序列,求一个数组的最长稳定子序列长度。
测试用例
测试用例:
input:
5
2 4 2 3 2
output:
3
题解
public class LongestSubsequence {
//T1.数组后一个数与前一个数差值的绝对值小于1则为稳定序列,求一个数组的最长稳定子序列长度。
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入数组长度:");
int n = scanner.nextInt();
int[] nums = new int[n];
System.out.println("请输入数组元素(用空格分隔):");
for (int i = 0; i < n; i++) {
nums[i] = scanner.nextInt();
}
// 数组输入完毕,可以进行相关操作
LongestSubsequence lg = new LongestSubsequence();
System.out.println("output:");
System.out.println(lg.longestSubsequence(nums));
}
public int longestSubsequence(int[] nums){
//用动态规划来做
//1.定义dp[i]为以i为下标元素结尾的最长稳定子序列长度
//2.if(abs(nums[i] - nums[i - 1]) < 1) dp[i] = dp[i - 1] + 1
//3.判断元素非空后,初始化 dp[i]=1
//4.遍历顺序,从前向后
int[] dp = new int[nums.length];
if (nums.length == 0){
return 0;
}
//初始化全部元素为1
Arrays.fill(dp,1);
int max = 1;//记录结果
for (int i = 1; i < nums.length; i++) {
if (Math.abs(nums[i] - nums[i - 1]) <= 1){
dp[i] = dp[i - 1] + 1;
max = Math.max(dp[i],max);//记录每个下标对应最长稳定子序列长度
}
}
return max;
}
}
执行结果截图
Q2
对字符串的指定区间内的字母进行重写2次的的操作。
测试用例
测试用例:
input:
6 2
abcdef
2 4
3 6
output:
abbbccccdddef
(变换过程:abcdef --> abbccddef --> abbbccccdddef)
题解
public class OverwriteTwo {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("请输入字符串长度和执行操作次数:");
int len = in.nextInt();//字符串长度
int num = in.nextInt();//执行操作次数
System.out.println("请输入字符串内容:");
String str = in.next(); // 只读取一个单词
OverwriteTwo ot = new OverwriteTwo();//定义类
System.out.println("请输入左右边界:");
int left = in.nextInt();//区间左边界
int right = in .nextInt();//区间右边界
String res = ot.rewriteString(str,left,right);
// System.out.println(res.toString());//先进行了一次,后面调用字符串res
if (num > 0){
for (int i = 0; i < num - 1; i++) {
System.out.println("请输入左右边界:");
left = in.nextInt();//区间左边界
right = in .nextInt();//区间右边界
res = ot.rewriteString(res,left,right);//注意此处调用res
}
}
System.out.println("output:");
System.out.println(res.toString());
}
public String rewriteString(String s, int start, int end) {
if (start < 0 || end > s.length() || start >= end) {
// 如果指定的区间不合法,则直接返回原字符串
return s;
}
StringBuilder sb = new StringBuilder(s);
for (int i = start; i <= end; i++) {
char c = s.charAt(i - 1);
sb.insert(start,c);//用insert(int offset, char c)在offset位置插入,该位置元素及其他元素往后移
start = start + 2;
}
return sb.toString();
}
}
执行结果截图
Q3
游游准备开车出游,她的车非常特殊,油越多则最高速度越快,即最高速度和油量是成正比的。另外,行驶过程中油是不会消耗的。已知游游的车初始的最高速度为vo,当游游花费了t时间加油时,车的最高 速度会变成v0+t* x.
游游开车的总里程为y,假设游游始终以最高速度行驶(即忽略加速时间),游游想知道,自己最少花费多少时间可以完成出游?
结果是一个浮点数,代表最终花费的总时间。如果你的答案和标准答案的相对误差不超过10e-6,则认为答案正确。
v x y都是输入的常数
输出最小时间
v大于0 小于10e9
x y大于1 小于 10e9
Q4
游游正在逛超市,有n个商品摆成排,第个商品的价格为ai,游游对它的真爱度为b。所有商品的价格都是偶数。
超市开展了一个活动, 当游游花费原价买了一件商品时,她可以用半价买下一件右边相邻的商品(也可以用原价购买,这样该商品右边的商品就有 一次享受半价的机会) 。但如果游游半价购买了一件商品, 那么下一件右边相邻的商品只能原价购买。
换言之,如果游游想要半价买某一件商品,必须先用原价买下它相邻的左边的那个商品。
游游初始的钱为 x,她想要买的商品的喜爱度总和尽可能大,但总价格不能超过 x,你能帮帮她计算最大的喜爱度总和吗?
n x a大于1 小于 1000
b大于1小于 10e9
二轮3.29笔试编程题(只做出Q1,Q4,其中一道MySQL)
Q1
游游拿到了一串数字,她想知道这串数字一共有多少个员圈?
提示:数字0、6、9这三种数字各有一个圆圈,数字8有两个圆圈
测试用例
输入描述
一个字符串,仅由数字字符组成。
长度不超过100000。
输出描述
该字符串包含的圆圈数量
示例
输入
1234567890
输出
5
题解
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
int count = 0;
for (int i = 0; i < str.length(); i++) {
char ch = str.charAt(i);
if (ch == '0' || ch == '6' || ch == '9'){
count++;
}else if(ch == '8'){
count += 2;
}
}
System.out.println(count);
}
Q2
游游定义一个排列中,满足以下条件的为“好元素”对于第i个元素a;而言,a;为前个元素的最大值。例如,[3,1,5,2.4]中,第一个和第三个元素是好元素
游游希望你构造一个长度为n的排列,其中有k个好元素,且任意两个好元素都不相邻。你能帮帮她吗?
排列的定义:由1到n所有正整数组成的长度为n的数组,每个正整数出现恰好一次。
测试用例
输入描述
两个正整数n,k,用空格隔开
1 <= n < = 10^5
1 <= k <= n/2
输出描述
一行n个正整数,代表游游构造的排列。有多解时输出任意即可。
示例
输入
5 2
输出
3 1 5 2 4
Q3
游游拿到了一个正整数n,她希望找到一对正整数x,y满足|x! × y一y一n|最小,且x,y都不等于2,感叹号表示阶乘。
输入描述
一个正整数n
1 <= n <=10^9
输出描述
输出两个正整数,分别表示x,y
如果有多解,输出任意一解即可通过
示例
输入
2
输出
1 1
Q4 (MySQL)考查关联查询、子查询、聚合函数、字符串函数
很简单,表信息比较多,感兴趣可私信