秋招突击——笔试整理——8/25——拼多多笔试整理

news2024/11/14 19:36:08

文章目录

    • 引言
    • 正文
      • 第一题——多多删树
        • 个人解答
      • 第二题、多多的奇数序列
        • 个人解答
      • 第三题:多多换礼物
        • 个人解答
        • 参考实现
      • 第四题、多多的字符反转
        • 个人实现
    • 总结

引言

  • 今天的拼多多笔试挺难的,感觉自己在技巧性还差很多,很多东西需要看很久,或者说思维方式有问题!总是执着于一个代码想很久!
  • 自己没截屏保存,题目来源——万诺coding

正文

第一题——多多删树

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

个人解答

在这里插入图片描述

  • 最终结果的有两个部分构成,边权和 + v【连通块数】
    • 如果不考虑数组v,那么就剩下边权和,那么不删除肯定是最多的
    • 不考虑连通块数,那么就是直接找v中最大的
  • 现在是必须删除的话,删除一个边权,就要加上一个V,所以的选择删除最小的边权,然后的找逐个添加对应的v,遍历完毕就是最大值。
  • 因为这是一个树,然后删除任何一条变,肯定会增加一个连通块!
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

/**
 * @author Long Guo
 * @create 2024-08-25-19:04
 *///TIP To <b>Run</b> code, press <shortcut actionId="Run"/> or
// click the <icon src="AllIcons.Actions.Execute"/> icon in the gutter.
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int T = in.nextInt();
        while(T > 0){
            T--;
            int n = in.nextInt();
            int[] nums = new int[n];
            for(int i = 0; i < n; i++)  nums[i] = in.nextInt() ;
            int[][] grid = new int[n + 1][n + 1];
            List<Integer> list = new ArrayList<>();
            in.nextLine();
            int sumWeight = 0;
            while (in.hasNextLine()){
                String line = in.nextLine();
                //in.nextLine();
                Scanner str = new Scanner(line);
                int x = str.nextInt();
                int y = str.nextInt();
                int w = str.nextInt();
                grid[x][y] = w;
                list.add(x);
                sumWeight += w;
            }
            Collections.sort(list);
            int res = sumWeight + nums[0];

            for(int i = 0;i < list.size();i ++){
                sumWeight = sumWeight - list.get(i);
                res = Math.max(res, sumWeight + nums[i + 1]);
            }

            System.out.println(res);
        }
    }
}

总结

  • 这个题目有一个关键点,就是他是树,所有节点的入度只能是1,只有一个父节点,但是可以有多个子节点,所以删除任何一条边,都会增加一个连通块!
  • 两个角度,只考边权和只考虑序列,然后在结合进行考虑即可!

第二题、多多的奇数序列

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

个人解答
  • 两种操作,都可以将偶数变成奇数,所以应该怎么做?两种操作同时考虑有点复杂,先仅仅考虑一种操作的。

操作一:不断减半

  • 不断除以二,直到是奇数为止
  • 假设:
    • 如果仅仅只有这一种操作,那么将所有的序列变成奇数的步骤数是固定的,直接遍历每一个偶数,然后计算对应的步数就行了!

操作二:两个数字替换为两数之和

  • 两个偶数相加 ,肯定还是偶数,并没有很任何意义
  • 两个奇数,不需要操作,因为已经满足了条件
  • 一个奇数一个偶数,相加直接是奇数
  • 假设:
    • 如果仅仅只有这一种操作,如果全部都是偶数,没有办法操作,但凡有一个奇数,那么操作次数就是偶数个数之和

两种操作混合

  • 这两种操作混合能否带来次数上的改良?
  • 如果一个数字需要执行操作一多次,才能变成奇数,就可以执行操作二
  • 先选一个需要最小次数就能变成奇数的数字,执行操作一,然后的后续的数字都执行操作二,就是最小的!
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

/**
 * @author Long Guo
 * @create 2024-08-25-19:04
 *///TIP To <b>Run</b> code, press <shortcut actionId="Run"/> or
// click the <icon src="AllIcons.Actions.Execute"/> icon in the gutter.
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int T = in.nextInt();
        while (T > 0){
            T --;

            int n = in.nextInt();
            int[] nums = new int[n];
            boolean evenFlag = false;
            int oddNum = 0;
            int oper1Min = Integer.MAX_VALUE;
            for (int i = 0; i < n; i++) {
                nums[i] = in.nextInt();

                if((nums[i] & 1) == 1){
                    // 判定是否为奇数
                    evenFlag = true;
                } else {
                    // 判定是否为偶数,并且记录对应偶数的修改次数的
                    oddNum ++;
                    int oper1Num = 0;
                    int temp = nums[i];
                    while ((temp & 1) == 0){
                        oper1Num ++;
                        temp = temp >> 1;
                    }
                    oper1Min = Math.min(oper1Min, oper1Num);
                }
            }

            // 具体处理
            if(evenFlag){
                //存在奇数,直接操作
                System.out.println(oddNum - 1);
            }else{
                // 不存在偶数
                System.out.println(oper1Min + oddNum - 1);
            }
        }
    }
}

总结

  • 这道题按照那种由简单到复杂的思路去分析,还是很好解决的,然后可以使用hashMap在优化一下,提高一下性能!

第三题:多多换礼物

在这里插入图片描述

在这里插入图片描述

个人解答
  • 先从简单的思路入手,看看怎么做,换礼物,只能换比x小的礼物,可以先抱着试试的角度出发,有几种角度可以试试看

从前往后找,能换就换

在这里插入图片描述

  • 直接换到了最小的1,执行不下去了,这个时候返回-1就行了

从后往前找,能换就换
在这里插入图片描述

  • 这个时候的返回1,因为就算拿到了最小的,但是结果已经成了

实现

  • 初步来看,从后往前换的,能换就换,可以解决这个问题
  • 因为只能更换比自己小的数字,所以有以下两种情况
    • 情况一:某一个数字比当前数字大
      • 你的初始值4,但凡比4大的数字你都不能换,因为你动不了
      • 这个时候可以处理一下,如果在不能换的数字中,存在倒序的,直接返回-1
    • 情况二:某一个数字比当前数字小
      • 这个更换的数字只会越来越大,所以不能从小数开始更换,应该从后往前进行交换,后面的数字越大的,而且后面如果有小数字,肯定是要换出来的,不然会报错!
      • 然后换到不能换为止,如果要换的一个数字,和周围两个数字都是有序,就没有必要换了
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

/**
 * @author Long Guo
 * @create 2024-08-25-19:04
 *///TIP To <b>Run</b> code, press <shortcut actionId="Run"/> or
// click the <icon src="AllIcons.Actions.Execute"/> icon in the gutter.
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNextInt()){
            int n = in.nextInt();
            int x = in.nextInt();
            int[] nums = new int[n];
            // 使用一个dp数组来记录前n个元素是否已经是单调递增
            boolean[] dp = new boolean[n];
            dp[0] = true;

            // 增加特判的最大值的boolean进行处理
            int numBig = 0;
            int minVal = Integer.MAX_VALUE;
            for (int i = 0; i < n; i++) {
                nums[i] = in.nextInt();
                minVal = Math.min(minVal, nums[i]);
                if (i > 0 && nums[i] >= nums[i - 1]){
                    dp[i] = dp[i - 1];
                }

                // 需要特判一下是否存在无法交换的值不是非单调递减的,不能交换的数字存在特别大的数字
                if(nums[i] >= x){
                    if(nums[i] > numBig)    numBig = nums[i];
                    else {
                        System.out.println(-1);
                        return;
                    }
                }
            }

            // 然后按照序列进行交换
            // 是否本来就已经有序了
            if (dp[n - 1]) {
                System.out.println(0);
                return;
            }

            int count = 0;
            int i ;
            for ( i = n - 1;i >= 0;i --){
                //是否进行更换
                if(nums[i] < x){
                    // 更换对应的值,这里只要是能够更换,就一定保证从i到n都是单调递增的
                    int temp = x;
                    x = nums[i];
                    nums[i] = temp;
                    count++ ;

                    // 判定一下,是否执行失败的,如果的
                    if (i > 0 && nums[i] >= nums[i - 1] && dp[i - 1]){
                        System.out.println(count);
                        return;
                    }
                    
                    // 判定是否满足迭代终止条件
                    if (i > 0 && x == minVal && !dp[i - 1]){
                        System.out.println(-1);
                        return;
                    }
                }
            }
            
            
        }
    }
}

总结

  • 其实这种又不能实现的题目,有一个空子可以钻,他仅仅只需要测试一个样例,如果不能找到就输出零,所以如果什么都没想到,就直接返回-1,能够过一部分样例,这个技巧真好用!
  • 当时没看到他说的,只能交换比他价格更低的物品,然后犹豫徘徊了很久,浪费了很多时间!
  • 有问题,我并不知道怎么解决!怎么证明!
参考实现

在这里插入图片描述

这个推论就不知道怎么实现,怎么证明是这样的?有点说不上来,但是有感觉!

import java.util.Arrays;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        int n = scanner.nextInt();
        int x = scanner.nextInt();

        int[] a = new int[n + 2];
        int[] b = new int[n + 2];

        for (int i = 1; i <= n; i++) {
            a[i] = scanner.nextInt();
            b[i] = a[i];
        }

        int pre = 1;
        int pos = n + 1;
        a[pos] = 1000000005; // 相当于 1e9+5 的整数值

        for (int i = 2; i <= n; i++) {
            if (a[i] >= a[pre]) {
                pre = i;
            } else if (a[i] < a[pos]) {
                pos = i;
            }
        }

        if (pos != n + 1) {
            b[pos] = x;
        }

        Arrays.sort(b, 1, n + 1);

        int res = 0;
        for (int i = 1; i <= n; i++) {
            if (a[i] > b[i]) {
                System.out.println(-1);
                return;
            }
            if (a[i] != b[i]) {
                res++;
            }
        }

        System.out.println(res);
    }
}

第四题、多多的字符反转

  • 这个题费的时间最多,有点轴了,并不知道具体应该怎么做,很难受!

在这里插入图片描述
在这里插入图片描述

个人实现

思维方式

  • 这道题就是见没见过的问题了,我就是想的是随便找一个位置开始反转,然后再找一个位置开始反转,每一次反转都计数,难点在于,有的时候,我并不知道给我一个字符串,我能不能反转出最长的序列,这是最尴尬的。然后就陷入了困顿。
  • 那正常应该怎么想?

在这里插入图片描述
画图发现了,无论怎么反转,都是成环的情况,所以还是得好好看一下

  • 原来是两个相邻的点,相当于圆的一个点,然后同时掰开,然后在放到外侧,外侧两个点本质上也是一个点
import java.util.Scanner;  
  
public class Main {  
    public static void main(String[] args) {  
        Scanner scanner = new Scanner(System.in);  
        int n = scanner.nextInt(); // 读取n  
        scanner.nextLine(); // 消耗掉n后的换行符  
        String st = scanner.nextLine(); // 读取字符串  
  
        // 将字符串复制一遍并拼接  
        String doubledSt = st + st;  
  
        int len = 1; // 当前长度  
        int res = 1; // 结果,记录最长无重复字符子串的长度  
  
        // 遍历拼接后的字符串  
        for (int i = 1; i < doubledSt.length(); i++) {  
            if (doubledSt.charAt(i) != doubledSt.charAt(i - 1)) {  
                len++; // 如果当前字符与前一个字符不同,则长度+1  
                res = Math.max(res, len); // 更新最长长度  
            } else {  
                len = 1; // 如果当前字符与前一个字符相同,则重置长度为1  
            }  
        }  
  
        // 输出结果,但考虑到原字符串长度限制,需要取结果与n的最小值  
        System.out.println(Math.min(res, n));  
  
        scanner.close();  
    }  
}

总结

  • 继续加油!
  • 转变思维,有简单到复杂,由直观到抽象,这种贪心模拟的题目一直是这样的!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2074714.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第3章-02-Python库Selenium安装与讲解

🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌,CSDN博客专家,阿里云社区专家博主,2023年CSDN全站百大博主。 🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责人。 🏆本文已收录于专栏:Web爬虫入门与实战精讲,后续完整更新内容如下。 文章…

windows javascript 打开、关闭摄像头

1. 效果 打开摄像头 关闭摄像头&#xff08;包括指示灯也关了的&#xff09; 2. 代码 open_close_camera.html // open_close_camera.html <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>use camera</title>…

CPP中lamada表达式作用一览[more cpp-6]

一般语法 CPP中的lambda 表达式的本质就是匿名函数&#xff0c;它可以在代码中定义一个临时的、局部的函数.为什么需要lamada表达式&#xff1f; 因为命名是个大问题 想名字以及避免命名冲突是很劳神费力的事&#xff0c;这就是lamada表达式的优点(lamada优点表现为简洁性)总…

7.Linux_GCC与GDB

GCC 1、GCC编译过程 首先使用编辑器对.c文件进行编辑&#xff0c;即&#xff1a;敲代码。之后GCC编译器会对.c文件进行预处理、编译、汇编、链接&#xff0c;最终输出可执行文件。具体流程如下&#xff1a; 四个阶段的含义及指令 1、预处理 指令&#xff1a;gcc - E <.…

专利服务系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;专利申请管理&#xff0c;分类号管理&#xff0c;专利管理&#xff0c;增值服务管理&#xff0c;业务指导信息管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页…

免费插件集-illustrator插件-Ai插件-路径节点分割路径

文章目录 1.介绍2.安装3.通过窗口>扩展>知了插件4.功能解释5.总结 1.介绍 本文介绍一款免费插件&#xff0c;加强illustrator使用人员工作效率&#xff0c;路径处理功能&#xff0c;功能是路径节点分割路径。首先从下载网址下载这款插件 https://download.csdn.net/down…

kubenetes--资源调度

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 出自B站博主教程笔记&#xff1a; 完整版Kubernetes&#xff08;K8S&#xff09;全套入门微服务实战项目&#xff0c;带你一站式深入掌握K8S核心能…

C语言 之 自定义类型:结构体

结构体类型的声明 结构体的声明 struct tag {member-list; //结构体中的成员&#xff0c;可以有多个 }variable-list; //这里是直接创建结构体的变量&#xff0c;但是不一定要在这里声明变量 //不能把后面这个 ; 省略了例如结构体用于描述一个学生&#xff1a; struct Stu…

48.给定一个 n × n 的二维矩阵表示一个图像,实现一个算法将图像原地顺时针旋转 90 度

48. Rotate Image 题目 你得到了一个 n x n 的二维矩阵,表示一张图像。 将图像顺时针旋转 90 度。 注意: 你必须 就地 旋转图像,这意味着你需要直接修改输入的二维矩阵。不能分配另一个二维矩阵来进行旋转。 示例 1: 输入: [ [1,2,3], [4,5,6], [7,8,9] ] 输出: [ [7,…

数据中台架构设计

由于当前项目需要对接多个不同的数据源&#xff0c;同时涉及到多端处理&#xff0c;而且需要考虑海量数据处理&#xff0c;还有总部与分部架构部署问题&#xff0c;因而整体技术栈倾向于大数据和分表分库式处理数据层接入问题。 简单讲&#xff0c;项目分为数据中台和业务中台…

介绍下线程池的七个参数

corePoolSize&#xff1a;核心线程数&#xff0c;池中要保留的线程数&#xff0c;即使它们处于空闲状态&#xff0c;除非设置了allowCoreThreadTimeOutmaximumPoolSize&#xff1a;最大线程数量keepAliveTime&#xff1a;线程存活时间unit&#xff1a;时间单位workQueue&#x…

【C++离线查询】2250. 统计包含每个点的矩形数目

本文涉及的基础知识点 离线查询 LeetCode2250. 统计包含每个点的矩形数目 给你一个二维整数数组 rectangles &#xff0c;其中 rectangles[i] [li, hi] 表示第 i 个矩形长为 li 高为 hi 。给你一个二维整数数组 points &#xff0c;其中 points[j] [xj, yj] 是坐标为 (xj,…

Linux——文件系统层次结构,绝对路径

一、文件系统层次结构 linux中所有文件存储在文件系统中&#xff0c;文件系统层次结构可以类比为一颗到立的树&#xff0c;最顶层为根目录/&#xff0c;根目录/底又分了/etc,/bin,/boot,/dev等子目录&#xff0c;而这些子目录底下又可以生成子目录分支。 以下为linux中较为重要…

亿图设备采集

这个数控系统的英文名是HUST,在台湾知名度还可以,但大陆这边我做这么多年项目也只接触过屈指可数的几次,可见市场占有率并不大。下面是一些介绍: 台灣億圖 HUST CNC 是一個充滿活力的公司,我們經營的目標是提供能滿足客戶之優良產品,以及優質的服務。我們的期望是使 HUS…

【STM32】驱动LCD

没买LCD屏&#xff0c;没有上机实践&#xff0c;只是学习了理论。 大部分图片来源&#xff1a;正点原子HAL库课程 专栏目录&#xff1a;记录自己的嵌入式学习之路-CSDN博客 目录 1 屏幕接口 2 屏幕驱动的基本步骤 3 8080时序的各信号线 4 8080的读和写 5 屏…

微信开发者工具上传代码到微信Git

1、创建Git用户并设置密码 2、创建项目 3、开发者工具中设置授权方式 4、开发者工具中设置创建地址 5、如有需要执行其他Git命令 到这里点击 “推送”可以上传代码到创建。

hutool excel 导出,格式错误,打开乱码

现象 最近在使用hutool excel 实现网站数据导出excel功能。在swagger 中调试接口时候遇到下载文件不能打开或者乱码的问题。 1. xlsx 文件不能打开 2. xls 文件打开乱码 解决方案 直接使用postman 或者 get 请求使用浏览器地址栏 总之&#xff0c;excel 文件不能导出&#xf…

一文带你全面理解Transformer的工作原理【图解】

文章目录 1、Transformer背景介绍1.1、Transformer的诞生1.1.1、首次提出1.1.2、后续的发展 1.2、Transformer的优势1.3、Transformer的市场 2、Transformer架构2.1、总览2.2、输入部分2.3、输出部分包含2.4、编码器部分2.4.1、总览2.4.2、详细拆分 2.5、解码器部分2.5.1、总览…

前沿重器[55] | prompt综述的解释和个人思考

前沿重器 栏目主要给大家分享各种大厂、顶会的论文和分享&#xff0c;从中抽取关键精华的部分和大家分享&#xff0c;和大家一起把握前沿技术。具体介绍&#xff1a;仓颉专项&#xff1a;飞机大炮我都会&#xff0c;利器心法我还有。&#xff08;算起来&#xff0c;专项启动已经…

输入名字和链接转换成对象

<!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>输入名字和链接转换成对象</title> </he…