牛客算法小题

news2025/3/12 12:40:16

目录

牛客.求和​编辑

牛客.abb

牛客.合并k个有序链表

牛客.滑雪(暴力->递归->记忆化搜索)

牛客.旋转字符串 


牛客.求和

 我没想到是dfs,另外我的dfs能力确实也不强,另外难度大的是他的那个输出

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    static int m;
    static int n;
    //用来标记路径中选择了谁
  static  boolean[]choose=new boolean[11];
    //标记总和
  static  int sum=0;
    public static void dfs(int x){
    if(sum==m){
        for(int i=1;i<=n;i++){
            if(choose[i]){
                System.out.print(i+ " ");
            }
        }
        System.out.println("");
        return;
    }
    if(sum>m||x>n) return;
    //选择x或者不选择x
    sum+=x;
//标记已经选择
    choose[x]=true;
    dfs(x+1);
    choose[x]=false;
    sum-=x;
    //假如不选择x,对任何东西都没有影响
    dfs(x+1);
    }
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
         n=in.nextInt();
         m=in.nextInt();
         //从1开始
         dfs(1);
    }
}

所以解法:采用如果两个相同,视为一个位置

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param str string字符串 
     * @return string字符串ArrayList
     */
     boolean[]vis;
     char[]s;
    ArrayList<String>m=new ArrayList<>();
    int n=0;
      StringBuffer p=new StringBuffer();
     public void  dfs(int pos){
        if(pos==n){
            m.add(p.toString());
            return ;
        }
        for(int i=0;i<n;i++){
            if(vis[i]==true){
                continue;
            }
            if(i>0&&s[i]==s[i-1]&&vis[i-1]==true){
                continue;
            }
            p.append(s[i]);
            vis[i]=true;
            dfs(pos+1);
            vis[i]=false;
            p.deleteCharAt(p.length()-1);
        }


     }
    public ArrayList<String> Permutation (String str) {
         n=str.length();
        vis=new boolean[n];
        s=str.toCharArray(); 
        Arrays.sort(s);
        dfs(0); 
        return   m;
     
    }
}

牛客.abb

解法:动态规划+哈希表(子序列问题)

1.状态表示:

dp[i]:以i位置为结尾的子序列中,有多少个_xx

2.返回值:

整张dp表的和

3.状态转移方程:

dp[i]=f[x]:应该是更新前的f[x],因为我们要统计多少个_xx应该是前面有多少个_x

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n=in.nextInt();
        String aa=in.next();
        char[]a=aa.toCharArray();
        int []f=new int[26];
        int []g=new int[26];
        long ret=0;
        for(int i=0;i<n;i++){
        ret+=f[a[i]-'a'];
        f[a[i]-'a']=f[a[i]-'a']+i-g[a[i]-'a'];
        g[a[i]-'a']=g[a[i]-'a']+1;
        }
        System.out.print(ret);
    }
}

牛客.合并k个有序链表

 

import java.util.*;

/*
//  * public class ListNode {
//  *   int val;
//  *   ListNode next = null;
//  *   public ListNode(int val) {
//  *     this.val = val;
//  *   }
//  * }
//  */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param lists ListNode类ArrayList 
     * @return ListNode类
     */
    public ListNode mergeKLists (ArrayList<ListNode> lists) {
       int n=lists.size();
       if(n==0||(n==1&&lists.get(0)==null)||(n==2&&lists.get(0)==null&&lists.get(1)==null)){
        return new ListNode(0).next;
       }
       PriorityQueue <Integer> q=new PriorityQueue<>();
       for(int i=0;i<lists.size();i++){ 
       ListNode a=lists.get(i);
       while(a!=null){
       q.add(a.val);
       a=a.next;
         }
       } 
       ListNode p=new ListNode(q.poll());
       ListNode head=p;
    
       while(!q.isEmpty()){
      p.next=new ListNode(q.poll());
      p=p.next;
       }



       return  head;
    }
}

牛客.滑雪(暴力->递归->记忆化搜索)

单纯的dfs,没有记忆化

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
       static int n = 0;
       static int m = 0;
       static int [][]arr=new int[101][101];
       static int[]dx={0,0,1,-1};
       static int[]dy={1,-1,0,0};
       
       public static int dfs(int p1,int p2){
         int len=1;
        for(int i=0;i<4;i++){
         int x=p1+dx[i];
         int y=p2+dy[i];
         if(x>=0&&x<n&&y>=0&&y<m&&arr[x][y]<arr[p1][p2]){
        //四种情况下点最大值
        len=Math.max(len,dfs(x,y)+1);
        }
  }
      return len;
       }
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
       n = in.nextInt();
       m = in.nextInt();
       arr=new int[n][m];
     for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            arr[i][j]=in.nextInt();
        }
     }

     int ret=0;
     for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            ret=Math.max(ret,dfs(i,j));
        }
     }
    System.out.print(ret);
    }
}

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
       static int n = 0;
       static int m = 0;
       static int [][]arr=new int[101][101];
       static int[]dx={0,0,1,-1};
       static int[]dy={1,-1,0,0};
//使用dp表来保存 从区域出发最长递减子序列
       static int[][]dp=new int[101][101]; 
       public static int dfs(int p1,int p2){
        if(dp[p1][p2]!=0){
//因为最短的长度是1,所以无需初始化。dp[p1][p2]有值
            return dp[p1][p2];
        }
         int len=1;
        for(int i=0;i<4;i++){
         int x=p1+dx[i];
         int y=p2+dy[i];
         if(x>=0&&x<n&&y>=0&&y<m&&arr[x][y]<arr[p1][p2]){
        //四种情况下点最大值
        len=Math.max(len,dfs(x,y)+1);
        }
  }
 //这里dfs走过之后,再dp[p1][p2]存储当前位置的最长递减子序列
         dp[p1][p2]=len;
      return len;
       }
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
       n = in.nextInt();
       m = in.nextInt();
       arr=new int[n][m];
     for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            arr[i][j]=in.nextInt();
        }
     }

     int ret=0;
     for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            ret=Math.max(ret,dfs(i,j));
        }
     }
    System.out.print(ret);
    }
}

牛客.旋转字符串 

解法:规律+接口

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 旋转字符串
     * @param A string字符串
     * @param B string字符串
     * @return bool布尔型
     */
    public boolean solve (String A, String B) {
        if (A.length() != B.length()) {
            return false;
        } else if (A.equals(B)) {
            return true;
        }
        return (A + A).contains(B);
    }
}

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

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

相关文章

医用氧检测标准:医用氧用什么检怎么检都做了明确规定

新规在《中国药典》2020 年版二部 XGB2021-061条于2022年5月22日实施。 医用氧技术指标&#xff1a;氧≥99.5% 、一氧化碳<0.0005、二氧化碳&#xff1c;0.03%、水分含量&#xff1c;0.0067%&#xff09; 一氧化碳对人体有害&#xff0c;过量的二氧化碳也会影响人的呼吸&a…

2024.8.20 作业

目录 思维导图&#xff1a; 面试题练习&#xff1a; 1、C语言中指针数组和数组指针的区别 2、结构体字节对齐的原理 3、TCP和UDP的区别 4、同步通信和异步通信的区别 5、多线程的理解 6、大小端验证 7、互斥锁 8、共享内存特点 9、C语言的指针 10、gcc编译 11、socket套接字 1…

探索顶级PDF水印API:PDFBlocks(2024年更新)

引言 在一个敏感信息常常面临风险的时代&#xff0c;能够轻松高效地保护文档的能力至关重要。PDF水印已成为企业和个人寻求保护其知识产权、确保文件保密性的基本工具。 PDFBlocks 文字水印 API是什么&#xff1f; PDFBlocks API 提供了一个强大的解决方案&#xff0c;用于在…

轮询系统寻客户

寻找收单客户&#xff0c;不管是源头老板&#xff0c;还是二手中介&#xff0c;不管是PayPal&#xff0c;条纹&#xff0c;还是其他信用卡或轮询系统&#xff0c;只要能收单&#xff0c;都可以免费加入我们。 ​在寻卖单客户&#xff0c;不管是源头订单还是跳转订单&#xff0c…

Redis篇一:初识Redis

文章目录 前言1. 初始Redis2. MySQL VS Redis3. 什么是分布式系统&#xff08;也是一种处理大量数据时的处理方式&#xff09;3.1 单机架构3.2 数据库与应用服务分离3.3 负载均衡3.4 数据库读写分离3.5 引入缓存&#xff08;Redis&#xff09;3.6 数据库分库分表3.7 引入微服务…

如何使用Web Scraper爬虫抓取数据?

Web Scraper是一个基于Chrome/火狐浏览器的插件&#xff0c;能够在网页上自动爬取数据&#xff0c;提供了丰富的配置&#xff0c;支持自动翻页、登录认证、JavaScript渲染等等&#xff0c;可以解决多数爬虫难题。 Web Scraper的安装也很简单&#xff0c;在Chrome应用商店里搜索…

【每日刷题】Day104

【每日刷题】Day104 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 3. 无重复字符的最长子串 - 力扣&#xff08;LeetCode&#xff09; 2. 1004. 最大连续1的个数 III…

RabbitMQ环境搭建

2.5.RabbitMQ 安装 a.docker方式安装&#xff1a; 1.在我的docker学习笔记中具有详细的安装过程 b.rpm包方式安装&#xff1a; 1.MQ下载地址2.这里是提前下载好后上传安装包到服务器得opt目录下&#xff1a; 3.安装MQ需要先有Erlang语言环境&#xff0c;安装文件的Linux命令…

机器学习:逻辑回归--下采样

目录 前言 一、为什么使用下采样 1.例如&#xff1a; 2.导致&#xff1a; 3.办法&#xff1a; 4.结果&#xff1a; 二、代码实现 1.完整代码 2.导入库 3.可视化混淆矩阵 4.导入数据 5数据预处理 6.下采样 7.取出训练集和测试集 8.建立模型 9.进行测试 总结 前…

Spring模块详解Ⅰ

目录 SpringSpring框架的主要功能模块1. Core Container&#xff08;核心容器&#xff09;2. Data Access/Integration&#xff08;数据访问与集成&#xff09;3. Web4. AOP (Aspect-Oriented Programming&#xff0c;面向切面编程)5. Instrumentation&#xff08;工具集&#…

CentOS7设置默认免密登录用户root

CentOS7设置默认免密登录用户root 步骤1、打开要更改的 CentOS 系统2、切换到root用户2、reboot重启系统 步骤 1、打开要更改的 CentOS 系统 2、切换到root用户 2、reboot重启系统

前端(Vue)动态换肤的通用解决方案及原理分析(1)

动态换肤原理分析 比如此处将来会实现换肤功能&#xff0c;所以我们不能直接写死&#xff0c;而需要通过一个动态的值进行指定。 <el-menu:default-active"activeMenu":collapse"!$store.getters.sidebarOpened":background-color"$store.getters…

手机使用技巧:如何恢复Android手机不见的短信

在您的 Android 手机上丢失短信可能是一种令人沮丧的经历&#xff0c;尤其是在文本包含重要信息的情况下。幸运的是&#xff0c;有一些方法可以在Android上恢复已删除的短信。在这篇博文中&#xff0c;我们将讨论几种在Android手机上恢复已删除短信的方法。 为什么需要恢复Andr…

测绘程序设计|认识VS2017|VS2017新建项目|VS2017使用技巧

由于微信公众号改变了推送规则&#xff0c;为了每次新的推送可以在第一时间出现在您的订阅列表中&#xff0c;记得将本公众号设为星标或置顶喔~ 分享了如何使用VS2017新建项目、VS2017的项目结构以及一些使用技巧~ &#x1f33f;前言 Visual Studio作为微软旗下一款热门的编程…

C语言典型例题46

《C程序设计教程&#xff08;第四版&#xff09;——谭浩强》 题目&#xff1a; 习题3.6 企业发放的奖金根据利润提成。利润I低于或等于100 000元的&#xff0c;奖金可提成10%&#xff1b; 利润高于100 000元&#xff0c;低于200000元&…

干货分享!渗透测试成功的8个关键

01 知道为什么要测试 执行渗透测试的目的是什么&#xff1f;是满足审计要求&#xff1f;是你需要知道某个新应用在现实世界中表现如何&#xff1f;你最近换了安全基础设施中某个重要组件而需要知道它是否有效&#xff1f;或者渗透测试根本就是作为你定期检查防御健康的一项例行…

2024年【电工(高级)】试题及解析及电工(高级)复审考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年【电工&#xff08;高级&#xff09;】试题及解析及电工&#xff08;高级&#xff09;复审考试&#xff0c;包含电工&#xff08;高级&#xff09;试题及解析答案和解析及电工&#xff08;高级&#xff09;复审…

C语言——字符函数、字符串函数和内存函数

目录 1.字符分类函数 2.字符转换函数 3.字符串函数 3.1strlen 函数 3.1.1 strlen函数的模拟实现 3.1.1.1第一种方法&#xff1a;计算器方法 3.1.1.2 第二种方法&#xff1a;指针-指针 3.1.1.3 第三种方法&#xff1a;递归 3.2 strcpy 函数 3.2.1 strcpy函数的模拟实现…

成为Python砖家(4): 装饰器的简单理解

第一次理解 Python 中的装饰器&#xff08;decorator&#xff09;&#xff0c;是Python中一个非常强大的工具&#xff0c;它是一个返回函数的函数。 上面这个定义很简洁&#xff0c;但是没说清楚。 第二次理解 装饰器&#xff0c;是一个接收函数 func、返回封装后的函数 wr…

计算机Java项目|基于SpringBoot的农商对接系统的设计与实现

作者主页&#xff1a;编程指南针 作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、多年校企合作经验&#xff0c;被多个学校常年聘为校外企业导师&#xff0c;指导学生毕业设计并参…