秋招突击——算法练习——8/3——马上消费笔试总结——{距离为一的字符串、组合数遍历}

news2024/9/22 15:35:35

文章目录

    • 引言
    • 正文
      • 第一题:距离为1的字符串
        • 个人实现
        • 修正实现
      • 第二题:三角形数
        • 个人实现
        • 反思实现
          • 比较对象使用equals
          • Collections.sort方法
    • 总结

引言

  • 今天的笔试难度不算大,但是自己的做的很糟糕,发现了很多问题,很多模板记混了!

正文

第一题:距离为1的字符串

  • 定义字符串S和字符串T的距离为1,满足以下三种情况
    • 仅仅修改S的一个字母,就能够和字符串T一摸一样
    • S仅仅增加一个字母,就可以和字符串T一摸一样
    • S仅仅删除一个字母,就可以和字符串T一摸一样
个人实现
  • 这里直接模拟,暴力写的,代码很不美观,具体如下
public class Main {
    public boolean editdistance (String s, String t) {
        // write code here
        int count = 1;
        if(s.length() == t.length()){
            // 长度相同,就修改一个字符
            for(int i = 0,j = 0;i < s.length() && j < t.length();i ++,j ++){
                if(s.charAt(i) != t.charAt(j))  count --;
                if(count < 0)   return false;
            }
            return true;

        }
        else if(s.length() < t.length() && s.length() + 1 == t.length()){
            // s比较短,添加一个字符就行
            for(int i = 0,j = 0;i < s.length() && j < t.length();){
                if(s.charAt(i) == t.charAt(j))  {
                    i ++;
                    j ++;
                }
                else{
                    if(count <= 0)    return false;
                    else{
                        // 不相等的情况下的
                        count --;
                        j++;
                    }
                }
                return true;
            }

        }
        else if(s.length() > t.length() && s.length() - 1 == t.length()){
            // s比较长,删除任意一个字符即可
            for(int i = 0,j = 0;i < s.length() && j < t.length();){
                if(s.charAt(i) == t.charAt(j)) {
                    i++;
                    j ++;
                }
                else{
                    if(count <= 0)    return false;
                    else{
                        // 不相等的情况下的
                        count --;
                        i ++;
                    }
                }
                return true;
            }

        }
        return false;
    }
    public static void main(String[] args) {
        System.out.println("Hello world!");
    }
}
  • 只能通过百分之九十的样例
修正实现

长度相同,用一个索引即可
在这里插入图片描述
逻辑重复,这里仅仅针对长度大于一的情况
在这里插入图片描述

public class Main {
    public boolean editdistance (String s, String t) {
        // write code here
        int count = 1;
        if(s.length() == t.length()){
            // 长度相同,就修改一个字符
            for(int i = 0;i < s.length() ;i ++){
                if(s.charAt(i) != t.charAt(i))  count --;
                if(count < 0)   return false;
            }
            return true;
        }
        else if(s.length() + 1 == t.length()){
            // s比较短,添加一个字符就行
            for(int i = 0,j = 0; j < t.length(); j ++){
                if(i < s.length() && s.charAt(i) == t.charAt(j))
                    i ++;
                else
                    count --;
                if(count < 0)    return false;
            }
            return true;

        }
        else if(s.length() - 1 == t.length()){
            // s比较长,删除任意一个字符即可
            for(int i = 0,j = 0; i < s.length();i ++ ){
                if(j < t.length() && s.charAt(i) == t.charAt(j)) 
                    j ++;
                else
                    count --;
                if (count < 0)
                    return false;
            }
            return true;

        }
        return false;
    }
    public static void main(String[] args) {
        System.out.println("Hello world!");
    }
}

发现我总是把不同的逻辑糅杂在一块,其实这个习惯很差,完全么有必要这样,代码不好写,而且容易出错,完全没有必要这样!

第二题:三角形数

  • 给你n个数字(n>=3),然后找出其中特殊三角形,该特殊三角形定义如下
    • 不能是等边三角形
    • 不能是直角三角形
    • 必须是三角形
  • 返回能够构成这个三角形的组合数量,是以索引为区分单位,并不是以具体数值为区分单位,所以即使排列的元素数值相同,也算作是两个。
个人实现
  • 这道题明着看,就是一道组合数,可以直接使用三层循环进行遍历,但是还是只能通过5%的样例,我本来使用回溯写的,但是写的太糟糕了,搞混了,没记住,每一次遍历的时候,应该就是遍历对应两种情况,存在或者不存在就行了,没有必要的在遍历剩余所有的元素了,这里写错了。
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Main {
    static int count;
    static List<Integer> list;
    static boolean check(){
        Collections.sort(list);

        // 等边三角形
        if(list.get(0) == list.get(1) && list.get(0) == list.get(1) )   return false;

        // 直角三角形
        float ab = list.get(0) * list.get(0) +  list.get(1) * list.get(1);
        float c = list.get(2) * list.get(2);
        if (ab == c)    return false;

        // 判定三角形
        boolean cond1 = list.get(1) + list.get(0) > list.get(2);
        boolean cond2 = list.get(2) + list.get(0) > list.get(1);
        boolean cond3 = list.get(1) + list.get(2) > list.get(0);
        if(cond1 && cond2 &&cond3) return true;
        return false;
    }
    static void dfs(int[] length,int idx){

        // 终止条件
        if(list.size() == 3 && check()){
            count ++;
            return;
        }

        if(idx == length.length)    return;

        // 迭代条件
        for(int i :length){
            // 当前元素不添加
            dfs(length,idx + 1);
            list.add(i);
            dfs(length,idx + 1);
            list.removeLast();
        }

    }
    static int happyTriangle (int[] length) {
        list = new ArrayList<>();
        count = 0;

        dfs(length,0);
        return count;
    }
    public static void main(String[] args) {
        int[] temp = {5,3,4,6,6,1};
        System.out.println(happyTriangle(temp));
    }
}

改变的list的元素顺序后,并没有恢复现场,导致情况异常
在这里插入图片描述
判定Integer对象是否相等用==,超过127就出错

在这里插入图片描述
最终修改如下,这个代码写的确实不行,这里纠正了,下次绝对不会再犯了!
在这里插入图片描述

反思实现
  • 这里编程的思路不够明确,这道题明确就是先套一个完全组合的模板,然后再实现一个三角形过滤函数就行了,但是编程的时候出现了很多问题,确实不应该!
  • 这里在对上述代码整理一下,具体实现如下
import javax.swing.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Main {
    static int count;
    static List<Integer> list;

    static boolean check(){
        int a = Math.max(list.get(0),Math.max(list.get(1),list.get(2)));
        int b = Math.min(list.get(0),Math.min(list.get(1),list.get(2)));
        int c = list.get(0) + list.get(1) + list.get(2) - a - b;

        // 判定直角三角形
        if(b * b + c * c == a * a) return false;

        // 判定等边三角形
        if(a == b && b == c) return false;

        // 判定是三角形
        if(b + c <= a)  return false;
        return true;
    }

    static void dfs(int[] length,int idx){
        // 迭代终止的条件
        if (idx == length.length){
            System.out.println(list);
            if (list.size() == 3 && check()){
                count ++;
            }
            return ;
        }

        // 每一次迭代内容,每一个元素是否有两种情况
        // 不放入对应的元素
        dfs(length,idx + 1);

        // 放入对应的元素
        if(list.size() < 3) {
            list.add(length[idx]);
            dfs(length, idx + 1);
            list.remove(list.size() - 1);
        }
    }

    static int happyTriangle (int[] length) {
        count = 0;
        list = new ArrayList<>();
        dfs(length,0);
        return count;
    }
    public static void main(String[] args) {
        int[] temp = {5,3,4,6,6,1};
        System.out.println(happyTriangle(temp));
    }
}

//[3, 4, 6]
//[3, 4, 6]
//[4, 6, 6]
//[1, 6, 6]
//17

比较对象使用equals

==

  • 默认是比较两个对象引用是否指向同一个内存地址
  • 对于基本数据类型(int,char)比较的是值,对于应用类型(integer,character)比较的是引用的地址

equals

  • 默认情况下比较的是对象的引用
  • 很多类比如integer等都重写了该方法,比较的是对象的内容

Integer对象的特殊情况

  • Integer是有一个缓存范围,-128到127,在这个范围内的Integer对象是缓存的,如果两个Integer对象的值在这个范围内值相同,实际是引用同一个对象。
  • 在这个范围内,equal和==的结果是相同的

比较值的话,还是使用equal进行比较

Collections.sort方法
  • Collections.sort会改变原来的list内部的元素的内容,我的代码中就有这个问题,改变了原来代码中的元素顺序,然后在弹出就不是原来的位置了!

总结

  • 这两道题虽然是比较简单,但是我做的并不好,并没通过所有的样例,但是学到了很多东西,纠正了很多以前做题的坏习惯,总结一下,具体如下

    • 判断引用对象相等用equal
    • 使用完Collections.sort记得恢复现场
  • 后续在加油!今天很棒!

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

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

相关文章

目标检测,目标跟踪,目标追踪

个人专做目标检测&#xff0c;目标跟踪&#xff0c;目标追踪&#xff0c;deepsort。YOLOv5 yolov8 yolov7 yolov3运行指导、环境配置、数据集配置等&#xff08;也可解决代码bug&#xff09;&#xff0c;cpu&#xff0c;gpu&#xff0c;可直接运行&#xff0c;本地安装或者远程…

JVM-类加载器和双亲委派机制

什么是类加载器&#xff1f; 类加载器是Jvm的重要组成之一&#xff08;类加载器、运行时数据区、执行引擎、本地库接口、本地方法库&#xff09;&#xff0c;负责读取java字节码并将其加载到Jvm中的组件 类加载器的分类 Java中的类加载器可以分为以下几种&#xff1a; 1. 启…

Yolov8在RK3588上进行自定义目标检测(一)

1.数据集和训练模型 项目地址&#xff1a;https://github.com/airockchip/ultralytics_yolov8.git 从github(htps:l/github.com/airockchip/ultralytics_yolov8)上获取yolov8模型。 下载项目&#xff1a; git clone https://github.com/airockchip/ultralytics_yolov8.git …

进程的虚拟内存地址(C++程序的内存分区)

严谨的说法&#xff1a; 一个C、C程序实际就是一个进程&#xff0c;那么C的内存分区&#xff0c;实际上就是一个进程的内存分区&#xff0c;这样的话就可以分为两个大模块&#xff0c;从上往下&#xff0c;也就是0地址一直往下&#xff0c;假如是x86的32位Linux系统&#xff0c…

InstantID节点安装遇到的问题与解决办法

原来在一台没有显卡支持的电脑上安装InstantID节点使用没有问题&#xff0c;将安装好的ComfyUI&#xff08;简称ComfyUI_CPU_OK包&#xff09;复制到一台有显卡支持的电脑上&#xff0c;竟然发现InstantID节点异常不能使用&#xff08;按道理应该能正常运行才对&#xff09;&am…

吴恩达机器学习L1W3L06-逻辑回归的梯度下降

目标 在本实验室&#xff0c;你可以看到 更新逻辑回归的梯度下降。在一个熟悉的数据集上探索梯度下降 import copy, math import numpy as np %matplotlib widget import matplotlib.pyplot as plt from lab_utils_common import dlc, plot_data, plt_tumor_data, sigmoid,…

SQL注入实例(sqli-labs/less-3)

0、初始页面 1、确定闭合字符 确定为字符型注入 ?id1 and 11 ?id1 and 12 确定闭合字符为 ‘) ?id1 ?id1) 2、确定表的列数 确定查询表的列数为3 ?id1) order by 3 -- 3、确定回显位置 确定回显位置为第二列和第三列 ?id-1) union select 1,2,3 -- 4、爆库名 …

MySQL数据库——数据库基础

二、数据库基础 1.主流数据库 SQL Sever:微软的产品&#xff0c;.Net程序员的最爱&#xff0c;中大型项目。Oracle:甲骨文产品&#xff0c;适合大型项目&#xff0c;复杂的业务逻辑&#xff0c;并发一般来说不如MySQL。MySQL&#xff1a;世界上最受欢迎的数据库&#xff0c;属…

《Advanced RAG》-01-朴素RAG存在的问题

摘要 文章阐述了RAG技术如何通过整合外部知识源来提升大型语言模型&#xff08;LLM&#xff09;的性能&#xff0c;使其能够产生更精确、上下文感知的回应&#xff0c;并减少幻觉现象。 自2023年以来&#xff0c;RAG已成为基于LLM的系统中最流行的架构&#xff0c;许多产品依赖…

一文彻底搞懂Fine-tuning - 预训练和微调(Pre-training vs Fine-tuning)

最近这一两周看到不少互联网公司都已经开始秋招提前批了。不同以往的是&#xff0c;当前职场环境已不再是那个双向奔赴时代了。求职者在变多&#xff0c;HC 在变少&#xff0c;岗位要求还更高了。 最近&#xff0c;我们又陆续整理了很多大厂的面试题&#xff0c;帮助一些球友解…

推荐算法学习记录2.2——kaggle数据集的动漫电影数据集推荐算法实践——基于内容的推荐算法、协同过滤推荐

1、基于内容的推荐&#xff1a; 这种方法根据项的相关信息&#xff08;如描述信息、标签等&#xff09;和用户对项的操作行为&#xff08;如评论、收藏、点赞等&#xff09;来构建推荐算法模型。它可以直接利用物品的内容特征进行推荐&#xff0c;适用于内容较为丰富的场景。‌…

VBA学习(22):动态显示日历

这是在ozgrid.com论坛上看到的一个贴子&#xff0c;很有意思&#xff0c;本来使用公式是可以很方便在工作表中实现日历显示的&#xff0c;但提问者因其需要&#xff0c;想使用VBA实现动态显示日历&#xff0c;即根据输入的年份和月份在工作表中显示日历。 下面是实现该效果的VB…

web、nginx

一、web基本概念和常识 ■ Web:为用户提供的一种在互联网上浏览信息的服务,Web服务是动态的、可交互的、跨平台的和图形化的。 ■ Web 服务为用户提供各种互联网服务,这些服务包括信息浏览服务,以及各种交互式服务,包括聊天、购物、学习等等内容。 ■ Web 应用开发也经过了几…

C#中计算矩阵(数学库下载和安装)

1、一步步建立一个C#项目 一步步建立一个C#项目(连续读取S7-1200PLC数据)_s7协议批量读取-CSDN博客文章浏览阅读1.7k次&#xff0c;点赞2次&#xff0c;收藏4次。这篇博客作为C#的基础系列&#xff0c;和大家分享如何一步步建立一个C#项目完成对S7-1200PLC数据的连续读取。首先…

如何解决C#字典的线程安全问题

前言 我们在上位机软件开发过程中经常需要使用字典这个数据结构&#xff0c;并且经常会在多线程环境中使用字典&#xff0c;如果使用常规的Dictionary就会出现各种异常&#xff0c;本文就是详细介绍如何在多线程环境中使用字典来解决线程安全问题。 1、非线程安全举例 Dictio…

文件搜索 36

删除文件 文件搜索 package File;import java.io.File;public class file3 {public static void main(String[] args) {search(new File("D :/"), "qq");}/*** 去目录搜索文件* param dir 目录* param filename 要搜索的文件名称*/public static void sear…

探索Prefect:Python自动化的终极武器

文章目录 探索Prefect&#xff1a;Python自动化的终极武器背景&#xff1a;自动化的呼唤Prefect&#xff1a;自动化的瑞士军刀安装Prefect&#xff1a;一键启动基础用法&#xff1a;Prefect的五招场景应用&#xff1a;Prefect的实战演练常见问题&#xff1a;Prefect的故障排除总…

字节一面面经

1.redis了解吗&#xff0c;是解决什么问题的&#xff0c;redis的应用&#xff1f; Redis 是一种基于内存的数据库&#xff0c;常用的数据结构有string、hash、list、set、zset这五种&#xff0c;对数据的读写操作都是在内存中完成。因此读写速度非常快&#xff0c;常用于缓存&…

IDEA的疑难杂症

注意idea版本是否与maven版本兼容 2019idea与maven3.6以上不兼容 IDEA无法启动 打开idea下载安装的目录&#xff1a;如&#xff1a;Idea\IntelliJ IDEA 2024.1\bin 在bin下面找到 打开在最后一行添加暂停 pause 之后双击运行idea.bat 提示找不到一个jar包&#xff0c;…

MyBatis 框架的两大缺点及解决方案

MyBatis 框架的两大缺点及解决方案 1. SQL 编写负担重1.1 缺点概述1.2 解决方案 2. 数据库移植性差2.1 缺点概述2.2 解决方案 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; MyBatis 作为一款广受欢迎的 Java 持久层框架&#xff0c;尽管其…