笔试强训(7)

news2024/11/26 10:25:38

第一题:两种排序方法(网易)两种排序方法_牛客题霸_牛客网

题目描述:考拉有N个字符串,任意两个字符串的长度都不是相同的,考拉现在学习到了两种字符串的排序方法

1)根据字符串的字典序排序,比如说

"car"<"carriage"<"cats"<"doggies"<"koala"

2)根据字符串的长度排序,例如:
"car" < "cats" < "koala" < "doggies" < "carriage"
考拉想知道自己的这些字符串排列顺序是否满足这两种排序方法,考拉要忙着吃树叶,所以需要你来帮忙验证。

思路:

1)我们可以单独写两个函数返回值是false,来分别进行判断是否按照字段排序和分别按照长度来进行排序

2)如果是按照字段进行排序那么使用compareTo,如果是按照长度来进行排序的话那就调用字符串的length()方法

import java.util.Scanner;
import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static boolean IsArt(String[] array){
        for(int i=1;i<array.length;i++){
            if(array[i-1].compareTo(array[i])>0){
                return false;
            }
        }
        return true;
    }
    public static boolean IsLength(String[] array){
        for(int i=1;i<array.length;i++){
            if(array[i].length()<array[i-1].length()){
                return false;
            }
        }
            return true;
        
    }
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        int n=Integer.parseInt(scanner.nextLine());
        String[] array=new String[n];
        for(int i=0;i<array.length;i++){
            array[i]=scanner.nextLine();
        }
          // System.out.println(Arrays.toString(array));
        boolean flag1=IsLength(array);
        boolean flag2=IsArt(array);
        if(flag1==true&&flag2==false){
            System.out.println("lengths");
        }else if(flag1==false&&flag2==true){
            System.out.println("lexicographically");
        }else if(flag1==true&&flag2==true){
            System.out.println("both");
        }else{
            System.out.println("none");
        }   
    }
}

扩展一下:判断一个整型数组是否是升序排列?

package com.example.demo;

import java.util.Scanner;
import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        int n=scanner.nextInt();
        int[] array=new int[n];
        for(int i=0;i<n;i++){
            array[i]=scanner.nextInt();
        }
        for(int i=0;i<array.length-1;i++){//因为i+1最终会导致数组越界
            if(array[i]>array[i+1]){
                System.out.println("当前数组不是升序排列");
                return;
            }
        }
        System.out.println("当前数组是升序排列");
    }
}
   for(int i=1;i<array.length;i++){//因为i+1最终会导致数组越界
            if(array[i]<array[i-1]){
                System.out.println("当前数组不是升序排列");
                return;
            }
        }
        System.out.println("当前数组是升序排列");

第二题:两个数的最小公倍数:最小公倍数__牛客网

第一种方法:从最大的数开始进行相加,但是时间复杂度是O(N),众所周知,最小公倍数

import java.util.*;
public class Main{
    public static int GetMax(int m,int n){
        return m>n?m:n;
    }
    public static void main(String[] args){
        Scanner scanner=new Scanner(System.in);
        int m=scanner.nextInt();
        int n=scanner.nextInt();
        int max=GetMax(m,n);
        for(int i=max;i<=Integer.MAX_VALUE;i++){
            if(i%m==0&&i%n==0){
                 System.out.println(i);
                break;
            }
       }
    }    
}

第二种方法:两个数的最小公倍数等于-->(A,B)两个数的最小公倍数是A*B/(A和B的最大公约数)

但是我们要注意:A和B两个数的相乘可能大于Integer的范围

import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner scanner=new Scanner(System.in);
        int a=scanner.nextInt();
        int b=scanner.nextInt();
        if(a==b){
            System.out.println(a);
            return;
        }
        int m=a;
        int n=b;
        int model=m%n;
        while(model!=0){
            m=n;
            n=model;
            model=m%n;
        }
        System.out.println(a*b/n);
    }
}

编程题第三题:另类加法另类加法__牛客网 

求出两个数的和,但是不能使用"+"运算

思路:我们在这个题中主要用到的运算符就是异或

异或:相同为0不同为1

异或:两个相同的十进制数异或,结果是0,一个数字和0异或,结果还是这个数,不考虑进为

1)我们还是需要进行注意:两个二进制位相异或的结果,就是两个数对应相加的结果,但是我们不会考虑进位

比如说1的二进制是0001,2的二进制是0010,但是1+2=3,我们对应的3的二进制位是0011

2)两个二进制位按位与后左移1位的结果,是两个数相加进位之后的结果

比如说1和2两个数(0001&0010)=0000,那就说明没有进位

比如说2和3两个数异或的结果是:0001

2和3两个数按位与左移一位的结果是:0100

假设我们此时还是想算两个数的和:那么就把把上面按位与和按位异或的结果在进行异或(就相当于是相加了),同时我们还需要进行判断按为与之后的结果是不是为0

public class UnusualAdd {
   public  int addAB(int A, int B) {
        if(B==0){
          return A;
        }
        int sum=A^B;
        int carray=(A&B)<<1;
        while(carray!=0){
            sum=A^B;
            carray=(A&B)<<1;
            A=sum;
            B=carray;
        }
        return sum;
    }
}

如果说实在不理解的话来举一个例子,比如说我们现在计算7和8的和,注意比特位一共是32位

A:7的二进制序列是111

B:6的二进制序列是110

6%2=0,6/2=3

3%2=1,3/2=1

1%2=1,1/2=1

用stringBuiler进行拼接再进行翻转,就可以得到6的二进制序列

1)sum=111^110=0001

2)carray=(111&110)<<1=1100(此时可以说最终的结果就是1101)

3)A=sum=0001,B=carray=1100

4)sum=A^B=1101

carray=0000,说明此时没有余数,那么最终的结果就是1101

编程题第四题:走方格的方案数_牛客题霸_牛客网 

题目大概叙述:请你计算n*m的棋盘格子,n是横向的格子数,m是竖向的格子数,现在要求你去求出从棋盘左上角出发沿着边缘线从左上角走到右下角,总共有多少种走法?况且不能走回头路

要求往右或者往下走,不能往左或者往上走

我们来看一下一些数据的特殊情况: 

1)m=1,n=1,现在主要是两条路径

 

2)此时让n=1,m>1(比如说m=3),此时我们发现路径条数是4条,也就是m+n

 

3)此时我们让n>1,m=1,比如说现在n=3,m=1

 

 总结:

1)当我们的N=1,并且M>=1,那么路径的总条数就是m+n

2)当我们的M=1,并且N>=1,那么路径的总条数就是m+n

3)此时n>1,m>1的时候,此时我们求的路径的总条数就可以抽象成:

现在我们具体的再来分析一下,逐步地进行抽象,我们先把整体分为从左上角到右下角的步数分成

从出发点向右走一步的那个点到终点的所形成的长方形的总步数+向下走一步的那个点到终点所形成的长方形到终点的步数

 此时我们再以绿色的点E为基准,这个点到D点的距离就相当于是:

1)从E点向右走一步到达的E点到终点D所最终的步数+从E点向下走一步到达的G点到终点D点最终所走的步数

2)但是我们最终发现,在不断地进行细分的时候,发现红色的小框的行数已经变成了1,那么此时我们就不需要在进行分解,直接可以算出总步数是m+n

3)但是上图中那一个蓝色的部分就是还是需要在进行分解

当我们的行数或者列数为1的时候,就是终止条件,所以直接返回m+n就可以了

import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static int func(int m,int n){
//如果说行数或者列数其中有一行大于1的,直接返回m+n
        if(m==1||n==1){
            return m+n;
        }
       //处理n大于1,m大于1的这种情况
        return func(m-1,n)+func(m,n-1);
    }
    public static void main(String[] args) {
      Scanner scanner=new Scanner(System.in);
      int m=scanner.nextInt();
      int n=scanner.nextInt();
      int result=func(m,n);
      System.out.println(result);
        }
}

自己可以画一下递归图,比如说写一个4行5列的总路径数

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

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

相关文章

CodeQL的自动化代码审计之路(下篇)

0x01 前言 CodeQL的自动化代码审计之路&#xff08;上篇&#xff09; CodeQL的自动化代码审计之路&#xff08;中篇&#xff09; 在上一篇文章中&#xff0c;我们基于CodeQL官方提供的sdk实现了自动化查询数据库功能&#xff0c;在文章中也提到实现完整的自动化代码审计还缺…

ggokabeito | 一般般啵~支持ggplot2和ggraph的配色包!~

1写在前面 天真的好冷啊&#xff0c;不知道各位穿秋裤了没有&#xff0c;有没有感冒。&#x1f618; 这期就介绍一下ggokabeito包&#xff0c;是一个支持ggplot2和ggraph的即用型配色包&#xff0c;喜欢就去安装吧。&#x1f92a; 再放一张去年拍的雪人照片&#xff0c;哈哈哈哈…

socket网络编程的5大误区

隐患 1&#xff0e;忽略返回状态 第一个隐患很明显&#xff0c;但它是开发新手最容易犯的一个错误。如果您忽略函数的返回状态&#xff0c;当它们失败或部分成功的时候&#xff0c;您也许会迷失。反过来&#xff0c;这可能传播错误&#xff0c;使定位问题的源头变得困难。 捕…

c++算法基础必刷题目——枚举

文章目录枚举算法1、铺地毯2、回文日期枚举算法 枚举算法是我们在日常中使用到的最多的一个算法&#xff0c;它的核心思想就是:枚举所有的可能。   枚举法的本质就是从所有候选答案中去搜索正确的解,使用该算法需要满足两个条件&#xff1a;   (1)可预先确定候选答案的数量…

[Square 2022] Hard Copy 复现

原来一直没弄过TLS的流&#xff0c;今天看到一个WP&#xff0c;按这个一步步重来一遍。 Square的题目会一直开放下载 原题点这里 下来后的数据包包含一个go的原码程序和一个流量包 流量是经过加密的&#xff0c;所以看不到内容。 第一步就是取得RSA的公钥。先在包里找到 S…

跟海外大牌正面PK,中国品牌如何出圈?

摘要&#xff1a;品牌出海看似风光无限、满是商机&#xff0c;但拆解开来看&#xff0c;无论是打造品牌还是出海&#xff0c;都是很漫长的过程。 导语&#xff1a; 后疫情时代&#xff0c;品牌出海成为大势所趋&#xff0c;从蒙牛、花西子到蜜雪冰城&#xff0c;越来越多的品…

web前端框架Javascript开发基础之JavaScript作用域

在JavaScript中&#xff0c;对象和函数也是变量。在JavaScript中&#xff0c;作用域是你可以访问的变量、对象和函数的集合。JavaScript有函数作用域: 这个作用域在函数内变化。 一、本地JavaScript变量 一个变量声明在JavaScript函数内部&#xff0c;成为函数的局部变量。 …

智慧物联网无线协同代理技术解决方案: 边缘协同感知(EICS)技术解密

无线协同代理技术指基于对目标场景状态变化的协同感知而获得触发响应并进行智能决策&#xff0c;属于蓝奥声核心技术–边缘协同感知(EICS&#xff09;技术的关键支撑性技术之一。该项技术涉及物联网边缘域的无线通信技术领域&#xff0c;具体主要涉及网络服务节点与目标对象设备…

Hive+Spark离线数仓工业项目--ODS层及DWD层构建(1)

目标&#xff1a;自动化的ODS层与DWD层构建实现 - 掌握Hive以及Spark中建表的语法规则 - 实现项目开发环境的构建 - 自己要实现所有代码注释 - ODS层与DWD层整体运行测试成功 数仓分层回顾 目标&#xff1a;回顾一站制造项目分层设计 实施 ODS层 &#xff1a;原始数…

Vulnhub:Derpnstink靶机渗透

攻击机kali&#xff1a;192.168.56.108 靶机derpnstink&#xff1a;192.168.56.114 扫描同网段下存活主机 扫描服务版本信息 开启了21、22、80端口&#xff0c;分别对应着ftp、ssh、http服务&#xff0c;打开浏览器进行访问 查看源代码发现flag1和info.txt 点开info.txt 这个的…

volantis使用php实现Gitee友链

介绍 本文使用Gitee实现Volantis主题友链功能&#xff0c;其中友链使用的是site标签&#xff0c;因为该标签可以展示图片&#xff0c;如 {% sites repo:example.json api:https://example.dearxuan.com %} 友链api的最终路径为 api “版本” repo&#xff0c;如上面代码的最…

【精准三点定位求解汇总】利用Python或JavaScript高德地图开放平台实现精准三点定位(经纬度坐标与平面坐标转换法求解、几何绘图法求解)

【精准三点定位求解汇总】利用Python或JavaScript高德地图开放平台实现精准三点定位&#xff08;经纬度坐标与平面坐标转换法求解、几何绘图法求解&#xff09; 众所周知&#xff0c;如果已知三个点的坐标&#xff0c;到一个未知点的距离&#xff0c;则可以利用以距离为半径画…

初学Nginx

目录 &#xff08;一&#xff09;Nginx介绍 &#xff08;二&#xff09;Nginx安装和启动 1&#xff0c;Nginx的目录结构 2&#xff0c;查看Nginx版本指令 3&#xff0c;检查配置文件是否正确 4&#xff0c;启动和关闭Nginx服务 &#xff08;三&#xff09;Nginx的配置 1&a…

智能工厂数字孪生的运用

信息技术与制造业的融合是当前的发展趋势&#xff0c;数字孪生其中 就包括了“智能工厂”的技术。在过去几年的发展中&#xff0c;我国的工业企业已经初步形成了 5 层的信息化体系结构&#xff0c;而在新一代的智能工厂体系中&#xff0c;借助数字孪生技术让工厂实现智能化生产…

SpringMVC使用Jackson、双向关联的解决策略@JsonIgnore

目录:一、SpringMVC和Jackson的关系&#xff1a;二、Jackson解决双向关联导致的栈溢出问题的解决方法&#xff1a;三、如何使用JsonIgnore&#xff1a;一、SpringMVC和Jackson的关系&#xff1a; SpringMVC返回return Object类型数据给前端时会自动调用jackson将Object类型的数…

pytorch深度学习常用命令

文章目录命令目录.item().items&#xff08;&#xff09;最大值的索引torch.argmax(input, dimNone, keepdimFalse)_, predicted torch.max(outputs.data, 1).data.detachunsqueeze()squeeze()命令目录 .item() 只是一个值 &#xff08;浮点型的&#xff09;&#xff0c;适合…

计算机基础知识(基础入门小白专属)三

♥️作者&#xff1a;小刘在这里 ♥️每天分享云计算网络运维课堂笔记&#xff0c;疫情之下&#xff0c;你我素未谋面&#xff0c;但你一定要平平安安&#xff0c;一 起努力&#xff0c;共赴美好人生&#xff01; ♥️夕阳下&#xff0c;是最美的&#xff0c;绽放&#xff0c;…

精通MyBatis原理,看这两篇就够了!|原创

本文详细介绍了阅读MyBatis源码的学习思路&#xff0c;并且对源码做了详细注释&#xff0c;讲解了整个Mybatis的启动过程。本文篇幅较长&#xff0c;建议收藏阅读&#xff0c;非常适合用于面试前的重点复习。点击上方“后端开发技术”&#xff0c;选择“设为星标” &#xff0c…

BSV 上的零知识隐私机器学习

此前&#xff0c;我们已经演示了在 BSV 上运行一个成熟的深度神经网络&#xff0c;其中机器学习 (ML) 算法的输入和模型都是公开的。在实践中&#xff0c;通常希望将输入或模型保持在链下并因此保持私有&#xff0c;同时仍确保 ML 算法如实运行。我们通过将零知识证明 (ZKP) 应…

你确定没有滥用 goroutine 吗

写在前面 学习 golang &#xff0c;路还很长呢&#xff0c;犹记得刚开始学习 golang 的时候&#xff0c;写起来确实非常简单&#xff0c;有很多包和工具使用&#xff0c;不需要重复造轮子&#xff0c;但是要真的学好一门语言作为工具&#xff0c;对于其原理是非常有必要学懂的…