2023.3.29 练习携程一轮3.7笔试题(牛客找的,附本人部分题解)+3.29二轮笔试题(亲自考的)

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;

    }
}

执行结果截图

image-20230329164601378

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();
    }
}
执行结果截图

image-20230329164031826

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)考查关联查询、子查询、聚合函数、字符串函数

很简单,表信息比较多,感兴趣可私信

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值