3.16美团笔试复盘

3.16美团复盘

第一题

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

题目分析

这一题比较简单,直接模拟即可,sum(a)-t1-t2;

import java.util.*;
class Main{
     public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        long sum=0;
        while(n-->0){
            sum+=sc.nextInt();
        }
        sum-=sc.nextInt();
        sum-=sc.nextInt();
        System.out.println(sum);

 }


}

第二题

image-20240318094608816

思路分析

  • 同样是一道模拟题
  • 我们可以统计大写数目
    • 全部变为小写:cnt,如果第一个字母大写(cnt–)
    • 全部变为大写:n-cnt;(小写字母的数量)
    • 比较两个值,输出最小的
import java.util.*;
class Main{
     public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        char[] ch=sc.next().toCharArray();
        int cnt=0;//大写的数量
        for(int i=0;i<ch.length;i++){
            if(isA(ch[i]))cnt++;
        }
        int t1=cnt;//全部变为小写
        if(isA(ch[0]))t1--;
        int t2=ch.length-cnt;//全部变为大写
        System.out.println(Math.min(t1,t2));
 }
 static boolean isA(char c){
    return c>='A'&&c<='Z';
 }
}

第三题

image-20240318103039166

题意分析

  • 考察知识点:快速幂算法

    static long qmi(int a,int k,int q){
        long res=1;
        long t=a;
        while(k>0){
            if((k&1)==1)res=(res*t)%q;
            k=k>>1;
            t=(t*t)%q;
        }
        return res;
     }
    
  • 我们只需要统计每个下标对应的翻倍次数,而后计算即可

import java.util.*;

class Main{
    static int mod=1_000_000_007;
     public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int q=sc.nextInt();
        int[] a=new int[n+1];
        for(int i=1;i<=n;i++)a[i]=sc.nextInt();
        int[] pow=new int[n+1];
        Arrays.fill(pow,q);
        for(int i=1;i<=q;i++){
            int index=sc.nextInt();
            pow[index]--;
        }
        long sum=0;
        for(int i=1;i<=n;i++){
             sum = (sum+ qmi(2, pow[i], mod) * a[i] % mod) % mod;
        }
        System.out.println(sum);
 }
 static long qmi(int a,int k,int q){
    long res=1;
    long t=a;
    while(k>0){
        if((k&1)==1)res=(res*t)%q;
        k=k>>1;
        t=(t*t)%q;
    }
    return res;
 }

}

题目四

1.树状数组(知识补充)

1.1lowbit
//求二进制最后一位1和后边0形成的数;11000则为  1000()
static int lowbit(int x){8
    return x&-x;
}
1.2 树状数组
  • 应用场景:支持单点修改和区间查询的数据结构;

    • 区间和:两个前缀和相减即可
    • 区间乘积
    • 区间异或
  • 注意下标从1开始

  • 一些操作

    • x 上一个c数组的右边界为 x-lowbit(x);
    • x 的祖先节点为: x+lowit(x);

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

//1.初始化,建树操作
//针对每个节点,把当前的值"贡献给父节点"
void init(){
    for(int i=1;i<=n;i++){
        c[i]+=a[i];
        int j=i+lowbit(i);
        if(j<=n){//父节点在范围内
            c[j]+=c[i];
            
        }
    }
    
}

//2.求前缀和即 [1....x]的和
static int sum(int x){
    int sum=0;
    while(x>0){
        sum+=c[x];
        x=x-lowbit(x);
    }
    return sum;
    
}

//3. 单点修改a[x],我们只修改管辖a[x] 的c[y];向后遍历
void add(int x,int k){//给a[x]加上k
    while(x<=n){
        c[x]=c[x]+k;
        x=x+lowbit(x);
    }
}

1.2题目分析

image-20240318151400409

思路分析

  • 我们发现 a[i]取值只有1和2两个,所以我们可以统计出所有的众数为2的区间 [l,r]即可
  • 我们令 1=-1;2=1;则对于每一个 r 如果sum[l,r]>0则众数为2
  • 为了求区间和我们可以使用前缀和数组来维护,但是搜索时会超时,所以我们使用树状数组维护左边小于我们的数
  • 在这里我们使用前缀和作为下标,而每个前缀和的权值作为值
  • 如果体现左边的: 从左都又遍历即可

继续分析

  • 我们发现前缀和的取值范围为[-n.n],而树状数组下标从1开始,所以我们增加一个偏移量 n+1;
  • 此时 取值范围为[1,2n+1],所以tr长度应该为 2n+2
import java.util.*;
class Main{
    //树状数组的数据结构
    static int n;
    static int[] tr;
    static int lowbit(int x){
        return -x&x;
    }
    static void add(int x,int k){ 
        while(x<=n+n+2){
            tr[x]+=k;
            x=x+lowbit(x);
        }
    }
    //查找x位置的前缀和
    static int get(int x){
        int sum=0;
        while(x>0){
            sum+=tr[x];
            x=x-lowbit(x);
        }
    
        return sum;
    }
    
     public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        n=sc.nextInt();
        tr=new int[2*n+100];
        int[] a=new int[2*n+100];
      
        for(int i=1;i<=n;i++){
            a[i]=sc.nextInt();
        }
        int sum=0;//统计前缀和
        add(sum+n+1,1);//前缀和为0也应该加入
       
        long ans=0;//统计众数和
        for(int i=1;i<=n;i++){
            if(a[i]==1){//1看作-1;
                sum-=1;
            }else {//2看作1
                sum+=1;
            }
            ans+=get(sum+n);//统计闭sum+n+1小的数,也就是为2的区间
            add(sum+n+1,1);//修改对应位置的数
        }
        ans=ans+(long)n*(n+1)/2;//注意这里防止爆int 
        System.out.println(ans);
 }
}

题目五

image-20240318160836720

思路分析

  • 思路一:利用归并求出每一个区间的逆序对,而后分别统计 [1,i-1],[i+1,n]和两个数分别位于两个区间的逆序对即可(考场思路)

树状数组

  • 当 i 位置取反后
    • 增加 i-1个逆序对
    • 减少 的逆序对为 前边比a[i] 大的,后边比a[i]小大,所以我们用树状数组求出这两部分即可
import java.util.*;
class Main{
    //维护的时x的左边有多少个数比他大
    static int n;
    static int[] tr;
    static int lowbit(int x){
        return -x&x;
    }
    static void add(int x,int k){
        while(x<=n){
            tr[x]+=k;
            x=x+lowbit(x);
        }
    }
    static int get(int x){
        int sum=0;
        while(x>0){
            sum+=tr[x];
            x=x-lowbit(x);
        }
        return sum;

    }
     public static void main(String[] args){
        long tot=0;//逆序对数量
        //统计右边比这个数小的数有多少
        Scanner sc=new Scanner(System.in);
        n=sc.nextInt();
        tr=new int[n+1];
        int[] a=new int[n+1];
        for(int i=1;i<=n;i++)a[i]=sc.nextInt();
        int[] low=new int[n+1];//对应位置下标,有多少个数比他小
        long[] ans=new long[n+1];
       //统计左边比该数大的
       int[] greater=new int[n+1];
       for(int i=1;i<=n;i++){
            int y=a[i];
            greater[i]=get(n)-get(y);//比y大的数,
            tot+=greater[i];
            add(y,1);
       }
       Arrays.fill(tr,0);
        for(int i=n;i>=1;i--){
            int y=a[i];//坐标
            low[i]=get(y);
            add(y,1);
        }
        for(int i=1;i<=n;i++){
            ans[i]=tot+i-1-low[i]-greater[i];
            System.out.print(ans[i]+" ");
        }
 }


}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

宜搭生产情况调试技巧

在宜搭生产环境中&#xff0c;经常会碰到一些人对于某些操作有报错&#xff0c;即便是有错误日志&#xff0c;但是错误日志没发获取详细的错误栈和错误信息,因此对于复刻某些操作是有必要的&#xff0c;这里我给出一个还蛮好用的方法。 首先找到错误操作的数据来源&#xff0c…

盛元广通全新智能实验室管理系统3.0强势上线

目前&#xff0c;盛元广通全新上线智能实验室管理系统3.0&#xff0c; 在原有的产品基础上迭代更新升级&#xff0c;此次升级以“新势能、智能化、低代码化”为产品功能赋能&#xff0c;从界面的整体布局、数据的维度、和兼容、安全性方面都实现了质的提升&#xff0c;系统在易…

代码随想录算法训练营第14天 part01 | 二叉树理论基础篇

代码随想录 二叉树理论基础篇 二叉树的种类 二叉树有两种主要的形式&#xff1a;满二叉树和完全二叉树 满二叉树&#xff1a;如果一棵二叉树只有度为0的结点和度为2的结点&#xff0c;并且度为0的结点在同一层上&#xff0c;则这棵二叉树为满二叉树。 这棵二叉树为满二叉树…

2023年迟到的年终总结

前言 一年又一年&#xff0c;过的好快啊。本以为上一年是黑云压城城欲摧&#xff0c;2023年可以甲光向日金鳞开&#xff0c;但是没想到23年更是黑暗啊&#xff0c;人生嘛总是十之八九不如意&#xff0c;一年的经历可以大概的概括为&#xff0c;业务转型的Q1&#xff0c;压力倍增…

悲观锁(Pessimistic Locking)是一种数据库锁定机制

悲观锁&#xff08;Pessimistic Locking&#xff09;是一种数据库锁定机制&#xff0c;用于防止多个事务同时修改同一数据记录。以下是关于悲观锁的一些详细信息&#xff1a; 锁定数据&#xff1a;当事务对一条记录进行操作时&#xff0c;悲观锁会阻止其他事务对这条记录进行修…

2024年全新的抖店电商创业玩法,一个月多赚大几千!实操教程在这

大家好&#xff0c;我是电商花花。 新一年&#xff0c;新征程&#xff0c;一些打工人回到自己的岗位上做着按部就班的工作。 然后也有一些创业的朋友就开始寻找着2024年的赚钱新机会和新风口。 作为在电商创业将近8年的我&#xff0c;预测2024年的风口依然是电商渠道&#x…

【Redis】基于Redis实现共享Session登录

用户登录是一种常用功能。这里记录一下基于Redis实现用户登录的代码。  下面是登录的流程图&#xff1a; 用户先提交手机号和验证码&#xff0c;服务器以手机号为key校验redis中存储的验证码&#xff0c;存在&#xff0c;则查询数据库中是否存在用户&#xff0c;不存在则创建…

【Quixel Mixer】简单介绍

一、下载 官网下载地址&#xff1a;Quixel Mixer - All-in-one texturing & material creation tool 下载好之后双击exe来安装 等待安装完成 下载后打开&#xff0c;新建一个工程和Mix 二、界面介绍 我们先将软件界面分为如下3个部分 1号区域为菜单栏 2号区域介绍 2号…

Windows Docker 安装

Docker 并非是一个通用的容器工具&#xff0c;它依赖于已存在并运行的 Linux 内核环境。 Docker 实质上是在已经运行的 Linux 下制造了一个隔离的文件环境&#xff0c;因此它执行的效率几乎等同于所部署的 Linux 主机。 因此&#xff0c;Docker 必须部署在 Linux 内核的系统上…

Linux —— 定时任务(sleep、crontab、at)

目录 1、使用 sleep 来完成定时任务 2、使用 crontab 来进行定时任务 3、使用 at 来执行单次的定时任务 1、使用 sleep 来完成定时任务 sleep n 等待 n 秒再继续往后执行 usleep n 等待 n 微秒再继续往后执行&#xff08;1 秒等于 1 000 000 微秒&#xf…

聚道云如何实现薪人薪事与金蝶云无缝对接,破解财务难题?

一、客户介绍 某科技有限责任公司是一家在信息技术领域具有显著影响力的企业&#xff0c;长期致力于为企业提供全面的解决方案和技术支持。在业务范围上&#xff0c;该公司覆盖了多个关键领域&#xff0c;包括云计算、大数据、人工智能等前沿技术。公司不仅提供定制化的技术解…

从资金管理的角度谈谈个人怎样交易现货白银

刚进入现货白银市场&#xff0c;个人要怎么交易现货白银的&#xff1f;这就涉及现货白银交易生涯的开启问题&#xff0c;开头开的好&#xff0c;我们整个交易生涯都将会有所裨益&#xff0c;所以我们要为个人怎样交易现货白银开个好头。下面我们就从资金管理的角度出发&#xf…

可视化搭建一个智慧零售订单平台

前言 智慧零售行业是在数字化浪潮中快速发展的一个领域&#xff0c;它利用先进的信息技术和大数据分析来提升零售业务的效率和顾客体验。智慧零售订单平台&#xff0c;具有跨平台、数据智能清洗和建模&#xff0c;以及更加丰富的数据展示形式等优势。智慧零售订单平台可以以文…

1.gradle编译和运行

1.在Windows 项目的根目录下使用.\gradlew.bat build命令进行编译。 如果出错的原因是连接超时&#xff1a; Exception in thread “main” java.io.IOException: Downloading from https://services.gradle.org/distributions/gradle-8.6-bin.zip failed: timeout (10000ms) a…

薄板/厚板模态分析Matlab有限元编程 | 【源码+理论文本】|板单元|板壳单元|Mindlin Reissner

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现&#xff0c;并提供所有案例完整源码&#xff1b;2.单元…

软件测试方法 -- 等价类边界值

测试用例的定义 测试用例是为了特定的目的而设计的一组测试输入、执行条件和预期的结果&#xff0c;以便测试是否满足某个特定需求。通过大量的测试用例来检验软件的运行效果&#xff0c;他是指导测试工作进行的依据。 下面我们介绍几种常用的黑盒测试方法 等价类划分法 定…

挑战杯 车位识别车道线检测 - python opencv

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习 机器视觉 车位识别车道线检测 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f947;学长这里给一个题目综合评分(每项满分5分) …

BOM(物料清单)是什么?在生产管理中有什么用?

BOM&#xff08;物料清单&#xff09;是什么&#xff1f;在生产管理中有什么用&#xff1f; 一、什么是BOM &#xff08;物料清单&#xff09;&#xff1f; 举个例子&#xff0c;做一双运动鞋&#xff0c;需要的配料可以笼统的分为鞋身和鞋带&#xff0c;那么由鞋身和鞋带组成…

部署高斯喷射项目gaussian-splatting

硬件要求 支持 CUDA 的 GPU&#xff0c;具有 7.0 的计算能力24 GB VRAM 软件要求 Conda用于 PyTorch 扩展的 C 编译器&#xff08;Visual Studio 2019&#xff09; CUDA SDK 11 for PyTorch 扩展&#xff0c;在 Visual Studio 之后安装C 编译器和 CUDA SDK 必须兼容 拉取源码 …

AI实景无人自动直播间怎么搭建?三步教你轻松使用

最近很多朋友看到AI自动直播带货玩法&#xff0c;也想开启自己的自动直播间&#xff0c;但还是有些问题比较担心&#xff0c;这种自动讲解、自动回复做带货的直播间是不是很麻烦&#xff1f; 实景无人自动直播 ​ 实际上这种直播间搭建相当简单便捷&#xff01;今天跟着笔者&…