【笔试算法】某某某些厂


这是某某某些大厂的笔试算法题,正在刷题的朋友们了解了解它与力扣上面的算法题的区别呀~ 要是有大佬顺便评论区帮帮就太好了~小菜鸟在线感激不尽~

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;
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值