万物的算法日记|第一天

news2025/2/12 10:57:08

笔者自述:

一直有一个声音也一直能听到身边的大佬经常说,要把算法学习搞好,一定要重视平时的算法学习,虽然每天也在学算法,但是感觉自己一直在假装努力表面功夫骗了自己,没有规划好自己的算法学习和总结,因为后半年也该找实习了,所以每日的算法题要进行恶补,勤能补拙,因此有了这一个算法日记系列;

必读: 大佬你好,感谢您的阅读,这篇文章是我的算法笔记,方便我每日回顾;
为了不耽误您的时间,我把本篇日记的考点方向和算法知识总结列出来,如果对您有需要要就进行阅读

也希望对您有帮助,和您一起通关算法!致谢

请添加图片描述

算法语言:java
题目来源:力扣–书本–初级算法,可以在力扣中搜索相关题名找到更多解法和大神方法
本文知识点:

  1. 随机数
    random.nextInt(j+1) 表示范围是从0-j
  2. 交换两个数的值
    交换两个数的值,使用异或操作,^= 效率更高,通过三次的异或操作,可以交换数组中的两个值,在不适用额外变量的情况下
  3. 筛选素数的方法
    埃拉托斯特尼筛法:从2开始,将每个素数的各个倍数,标记为合数,剩下的未标记的就是素数。
  4. 位运算
    可以通过位运算和0、1相与的操作来判断该位上是否是1,>>> 表示无符号右位移,并且在最左边插入零, >> 表示有符号位移,他们两个的区别是 >>> 不考虑符号位,这样可以保证被移动数的为模式不变,不会因为符号位的扩展而改变其值,>>考虑符号位

文章目录

  • 打乱数组
  • 计数质数
  • 位1的个数
  • 汉明距离
  • 颠倒二进制位

打乱数组

在这里插入图片描述
代码:

class Solution {
    private int[] nums;
    private Random random;
    public Solution(int[] nums) {
        this.nums = nums;
        random = new Random();
    }
    
    public int[] reset() {
        return nums;
    }
    
    public int[] shuffle() {
        if(nums == null){
            return null;
        }
        int []a = nums.clone();
        for(int j =1;j<a.length;j++){
            int i = random.nextInt(j+1);
            swap(a,i,j);
        }
        return a;
    }
    private void swap(int []a,int i,int j){
        if(i != j){
            a[i] ^= a[j];
            a[j] ^= a[i];
            a[i] ^= a[j];
        }
    }
}

学到的知识点:

  1. random.nextInt(j+1) 表示范围是从0-j
  2. 交换两个数的值,使用异或操作,^= 效率更高,通过三次的异或操作,可以交换数组中的两个值,在不适用额外变量的情况下

计数质数

在这里插入图片描述
代码:

class Solution {
    public int countPrimes(int n){
        boolean[] arr = new boolean[n];
        int cnt = 0;
        //埃拉托斯特尼筛法
        for(int i =2;i<n;i++){
            if(arr[i])
                continue;
            cnt++;
            for(int j =i;j<n;j+=i){
                arr[j] = true;
            }
        }
        return cnt;
    }
}

学到的知识点:

  1. 筛选素数的方法:
    埃拉托斯特尼筛法:从2开始,将每个素数的各个倍数,标记为合数,剩下的未标记的就是素数。
代码模版:
        for(int i =2;i<n;i++){
            if(arr[i])
                continue;
            cnt++;
            for(int j =i;j<n;j+=i){
                arr[j] = true;
            }
        }

位1的个数

在这里插入图片描述
代码:


// 位1 的个数
public class day6_12_6 {
    //将 n 向右移
    public int hammingWeight(int n ){
        int count =0;
        for(int i =0;i<32;i++){
            if(((n>>>i) &1) == 1){
                count++;
            }
        }
        return count;
    }
    //将 1 向左移
    public int hammingWeight1(int n){
        int count = 0;
        for(int i =0;i<32;i++){
            if((n%(1<<i)) != 0){
                count++;
            }
        }
        return count;
    }
}

学到的知识点:

  1. 可以通过位运算和0、1相与的操作来判断该位上是否是1,>>> 表示无符号右位移,并且在最左边插入零, >> 表示有符号位移,他们两个的区别是 >>> 不考虑符号位,这样可以保证被移动数的为模式不变,不会因为符号位的扩展而改变其值,>>考虑符号位

汉明距离

在这里插入图片描述
代码:

class Solution {
     public int hammingDistance(int x,int y){
        int xor = x^y;
        int res = 0;
        while(xor != 0){
            res+=xor&1;
            xor = xor>>>1;
        }
        return res;
    }
}

学到的知识点:

  1. 有两个数,通过异或操作,在二进制表达式中,如果同一对位数相同经过异或操作就是0,不同就是1,所以之后通过无符号移动和1进行与操作就可以得出两个不同的数之间的二进制距离了、

颠倒二进制位

在这里插入图片描述
代码:

public class Solution {
    // you need treat n as an unsigned value

    //    res <<= 1;: 这行代码将 res 左移一位,相当于将 res 中的所有位向左移动一个位置。这样做是为了为下一步的操作腾出一个空位。
//    res += n & 1;: 这行代码将 n 的最低位(即最右边的位)与 1 进行按位与操作,并将结果加到 res 中。这样做是为了将 n 的最低位放置到 res 的对应位置。
//    n >>= 1;: 这行代码将 n 右移一位,将 n 的所有位都向右移动一个位置。这样做是为了处理 n 的下一位。
//    通过循环的迭代,每次将 n 的最低位取出,并将其放置到 res 的对应位置上,最终完成了整数的二进制反转。
    public int reverseBits(int n){
        int res = 0;
        for(int i =0;i<32;i++){
            res <<=1;
            res+=n&1;
            n>>=1;
        }
        return res;
    }
}

学到的知识:

  1. 两个不同的数 相加,其实底层是位运算的相加,这就不难理解,上述代码中res+=n&1 这一步操作了

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

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

相关文章

内部服务器端口映射实验:打通内外网络,实现公网访问内部服务

内部服务器端口映射实验&#xff1a;打通内外网络&#xff0c;实现公网访问内部服务 【实验目的】 部署服务器地址转换。熟悉服务器地址转换的应用方法。验证配置。 【实验拓扑】 实验拓扑如图所示。 实验拓扑 设备参数如表所示。 设备参数表 设备 接口 IP地址 子网掩…

BOM,什么是BOM?

4.BOM 4.1 什么是BOM? BOM&#xff08;Browser Object Model&#xff09;即浏览器对象模型&#xff0c;它提供了独立于内容而与浏览器窗口进行交互的对象&#xff0c;其核心对象是 window。 ​ BOM 由一系列相关的对象构成&#xff0c;并且每个对象都提供了很多方法与属性。 …

react---todoList案例

todoList案例效果图 1.组件拆分 2.操作state数据 state 放在哪个组件&#xff1a; 如果某个组件组件使用: 放在其自身的state中。如果某些组件使用&#xff1a;放在他们共同的父组件state中&#xff08;官方称此操作为状态提升&#xff09; 状态&#xff08;state&#xff09;在…

Cocos creator实现飞机大战空中大战《战击长空》小游戏资源及代码

Cocos creator实现飞机大战空中大战《战击长空》小游戏资源及代码 最近在学习Cocos Creator&#xff0c;作为新手&#xff0c;刚刚开始学习Cocos Creator&#xff0c;刚刚入门&#xff0c;这里记录一下飞机大战小游戏实现。 https://wxaurl.cn/VEgRy2eTMyi 一 安装CocosDashBo…

Netty实战(十四)

WebSocket协议&#xff08;二&#xff09; 一、初始化 ChannelPipeline二、引导三、加密 一、初始化 ChannelPipeline 我们之前说过为了将 ChannelHandler 安装到 ChannelPipeline 中&#xff0c;需要扩展了ChannelInitializer&#xff0c;并实现 initChannel()方法。 下面我…

Nacos架构与原理 - 注册中心的设计原理

文章目录 Pre服务的分级模型 &#xff08;服务-集群-实例三层模型&#xff09;数据⼀致性负载均衡服务端侧负载均衡客户端侧负载均衡 健康检查性能与容量易用性集群扩展性用户扩展性 Pre 目前的网络架构是每个主机都有⼀个独立的 IP 地址&#xff0c;那么服务发现基本上都是通…

行为型设计模式07-命令模式

&#x1f9d1;‍&#x1f4bb;作者&#xff1a;猫十二懿 ❤️‍&#x1f525;账号&#xff1a;CSDN 、掘金 、个人博客 、Github &#x1f389;公众号&#xff1a;猫十二懿 命令模式 1、命令模式介绍 命令模式&#xff08;Command&#xff09;&#xff0c;将一个请求封装为一…

【Linux后端服务器开发】常用开发工具

目录 一、apt / yum 二、gcc / g 三、make / makefile 四、vi / vim 五、gdb 一、apt / yum apt 和 yum 都是在Linux环境下的软件包管理器&#xff0c;负责软件的查找、安装、更新与卸载。 apt 是Ubuntu系统的包管理器&#xff0c;yum是Centos系统的包管理器&#xff0c…

SQL回顾总结,超级全

SELECT&#xff1a;语句用于从数据库中选取数据 从 "Websites" 表中选取 "name" 和 "country" 列 SELECT name,country FROM Websites 从 "Websites" 表中选取所有列 SELECT * FROM Websites; SELECT DISTINCT&#xff1a;用于返…

Android系统视角下对APK的分析(2)- APK安装过程的定性分析

声明 以Android手机用户角度来看&#xff0c;安装各式各样的APP&#xff0c;基本就是从应用市场上 “搜索->下载->安装” 三连。而对Android系统来说&#xff0c;这就是个大工程了&#xff0c;因为对Android系统来说APK是“外来户”&#xff0c;如何安装它、有限制地支持…

linux实验三 vi编辑器及用户管理

1、vi编辑器的详细使用 &#xff08;1&#xff09;在用户主目录下建一个名为vi的目录。 &#xff08;2&#xff09;进入vi目录。 &#xff08;3&#xff09;将文件/etc/man_db.conf复制到当前目录下&#xff0c;并用命令sudo修改man_db.conf的属性为所有用户可以读写。 &am…

.net版本下载

1先登录微软 Microsoft - 云、计算机、应用和游戏 下载 .NET Framework | 免费官方下载

【Oauth2请求不带client_id,获取方法】

文章目录 前言一、关键&#xff1a;请求头 Basic xxx:xxx二、源码分析BasicAuthenticationFilter 类extractAndDecodeHeader 方法authenticate方法loadUserByUsername 方法 总结 前言 这段时间在学习 oauth2, 发现我组用的框架&#xff0c;登录请求参数中并没有 client_id &a…

JVM 面试必会面试题

1. 说一说JVM的主要组成部分 点击放大看&#xff0c;一图胜千文 jvm 方法区和堆是所有线程共享的内存区域&#xff1b;而虚拟机栈、本地方法栈和程序计数器的运行是线程私有的内存区域&#xff0c;运行时数据区域就是我们常说的JVM的内存。类加载子系统&#xff1a;根据给定的…

Altium Designer二次开发

Altium Designer二次开发就在该软件原有的基础上&#xff0c;自己写代码给它添加新功能&#xff0c;如&#xff1a;一键生成Gerber&#xff0c;计算铺铜面积&#xff0c;PCB走线的寄生参数和延时等等。 Altium Designer二次开发有两种方式&#xff0c;一种是基于Altium Designe…

Hadoop集群部署和启动与关闭

Hadoop集群的部署方式分为三种&#xff0c;分别是独立模式&#xff08;Standalone mode&#xff09;、伪分布式模式&#xff08;Pseudo-Distributed mode&#xff09;和完全分布式模式&#xff08;Cluster mode&#xff09;&#xff0c;独立模式和伪分布式模式主要用于学习和调…

Day974.授权码和访问令牌的颁发流程 -OAuth 2.0

授权码和访问令牌的颁发流程 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于授权码和访问令牌的颁发流程的内容。 授权服务就是负责颁发访问令牌的服务。更进一步地讲&#xff0c;OAuth 2.0 的核心是授权服务&#xff0c;而授权服务的核心就是令牌。 为什么这么说…

被冻结的层在训练过程中参与正向反向传递,只是这一层的梯度不再更新。||底层逻辑

被冻结的层可以前向传播,也可以反向传播,只是自己这一层的参数不更新,其他未冻结层的参数正常更新。 在微调期间&#xff0c;只有被激活的层的梯度会被计算和更新&#xff0c;而被冻结的层的梯度则会保持不变。 其实从数学上去理解也不难&#xff0c;但自己手推还是需要花点时…

《自然》:DeepMind推出AlphaDev或将加速全球计算

数字世界对计算和能源的需求正在不断增加。在过去的五十年中&#xff0c;人类主要依靠硬件层面的改进来满足这一点。然而&#xff0c;随着微芯片接近其物理极限&#xff0c;改进计算机运行代码&#xff0c;以使计算算力更强大和可持续&#xff0c;变得至关重要。对于每天运行数…

线程的生命周期

我是一个线程 第一回 初生牛犊 我是一个线程&#xff0c;我一出生就被编了个号: 0x3704&#xff0c;然后被领到一个昏暗的屋子里&#xff0c;在这里我发现了很多和我一模一样的同伴。 我身边…