力扣21-30题(数学的简单的结束和数组的前几道)

news2024/11/25 19:17:36

20240721

  • 1.题和解析
    • 693. 交替位二进制数
    • 405. 数字转换为十六进制数
    • 171 excel 表序列号
  • 从这之后的是数组了
    • 2011. 执行操作后的变量值
    • 1929. 数组串联
    • 1720. 解码异或后的数组
    • 异或解析:
    • 2574. 左右元素和的差值
    • 101. 对称二叉树
    • LCP 06. 拿硬币
    • 1365. 有多少小于当前数字的数字

1.题和解析

693. 交替位二进制数

简单
给定一个正整数,检查它的二进制表示是否总是 0、1 交替出现:换句话说,就是二进制表示中相邻两位的数字永不相同。

class Solution {
    public boolean hasAlternatingBits(int n) {
        int prev = 2;
        while (n != 0) {
            int cur = n % 2;
            if (cur == prev) {
                return false;
            }
            prev = cur;
            n /= 2;
        }
        return true;
    }
}

使用位运算:

class Solution {
    public boolean hasAlternatingBits(int n) {
        int a = n ^ (n >> 1);
        return (a & (a + 1)) == 0;
    }
}

分析:

假设 n 的二进制表示为 101010:
n >> 1 的结果是 010101。
n ^ (n >> 1) 的结果是 111111。
a = 111111,a + 1 = 1000000。
a & (a + 1) = 111111 & 1000000 = 0,符合条件。
因此,(a & (a + 1)) == 0 为 true,说明 n 的位是交替的。


1010
0101
----
1111

405. 数字转换为十六进制数

都是位运算
官解:

class Solution {
    public String toHex(int num) {
        if (num == 0) {
            return "0";
        }
        StringBuffer sb = new StringBuffer();
        for (int i = 7; i >= 0; i --) {
            int val = (num >> (4 * i)) & 0xf;
            if (sb.length() > 0 || val > 0) {
                char digit = val < 10 ? (char) ('0' + val) : (char) ('a' + val - 10);
                sb.append(digit);
            }
        }
        return sb.toString();
    }
}

其他的:

class Solution {
    public String toHex(int num) {
        // 负数 a 取反加上 a 的绝对值后,答案的二进制为32位1,在 long 中代表 (long)Math.pow(2, 32) - 1
        // 因此 负数 a 取反后加一的二进制和 (long)Math.pow(2, 32) 一样,16进制固然也一样
        if (num == 0) {
            return "0";
        }
        long a = num >= 0 ? num : (long)Math.pow(2, 32) + num;
        StringBuilder sb = new StringBuilder();
        while (a != 0) {
            int mod = (int)(a % 16);
            if (mod > 9) {
                sb.append((char)('a' + mod - 10));
            } else {
                sb.append(mod);
            }
            a = a / 16;
        }
        return sb.reverse().toString();
    }
}

171 excel 表序列号

class Solution {
    public int titleToNumber(String columnTitle) {
      int n = columnTitle.length();  // 获取列标题的长度
        int ans = 0;  // 初始化结果变量
        for(int i = 0; i < n; i++) {  // 遍历列标题中的每个字符
            ans = ans * 26 + (columnTitle.charAt(i) - 'A' + 1);  // 将当前字符转换为数字并累加到结果中,.charAt(i)拿到第i个字符,通过ASCII码也行
        }
        return ans;  // 返回最终的列号
    }
}

ASCII:

 // 获取索引为 1 的字符
        char ch = str.charAt(1);
        
        // 获取该字符的 ASCII 码
        int asciiCode = (int) ch;

从这之后的是数组了

2011. 执行操作后的变量值

存在一种仅支持 4 种操作和 1 个变量 X 的编程语言:
++X 和 X++ 使变量 X 的值 加 1
–X 和 X-- 使变量 X 的值 减 1
最初,X 的值是 0

给你一个字符串数组 operations ,这是由操作组成的一个列表,返回执行所有操作后, X 的 最终值 。
终于和官解一样了!!

class Solution {
    public int finalValueAfterOperations(String[] operations) {
                int sum=0;
                for(String op:operations){
                    if(op.equals("X++")||op.equals("++X")){
                        sum++;
                    }else{
                        sum--;
                    }
                }
                return sum;
    }
}

1929. 数组串联

给你一个长度为 n 的整数数组 nums 。请你构建一个长度为 2n 的答案数组 ans ,数组下标 从 0 开始计数 ,对于所有 0 <= i < n 的 i ,满足下述所有要求:

ans[i] == nums[i]
ans[i + n] == nums[i]
具体而言,ans 由两个 nums 数组 串联 形成。

返回数组 ans 。
官解:

class Solution {
    public int[] getConcatenation(int[] nums) {
 int length = nums.length;
        int[] ans = new int[length << 1];
        for (int i = 0; i < length; i++) {
            ans[i + length]= ans[i] = nums[i];
        }
        return ans;
    }
}

1720. 解码异或后的数组

未知 整数数组 arr 由 n 个非负整数组成。

经编码后变为长度为 n - 1 的另一个整数数组 encoded ,其中 encoded[i] = arr[i] XOR arr[i + 1] 。例如,arr = [1,0,2,1] 经编码后得到 encoded = [1,2,3] 。

给你编码后的数组 encoded 和原数组 arr 的第一个元素 first(arr[0])。

请解码返回原数组 arr 。可以证明答案存在并且是唯一的。

class Solution {
    public int[] decode(int[] encoded, int first) {
        int n = encoded.length + 1;//首先先拿到原数组的长度
        int[] arr = new int[n];//定义一个原数组长度的数组
        arr[0] = first;//把第一个元素放进去
        for (int i = 1; i < n; i++) {
            arr[i] = arr[i - 1] ^ encoded[i - 1];//这个就是带公式
        }
        return arr;
    }
}

异或解析:

OR(异或)是一种二进制逻辑运算,其符号通常为 ^。XOR 运算的规则是:如果两个相应的二进制位相同,则结果为 0,如果不同,则结果为 1。

下面是如何进行 XOR 运算的步骤:

按位运算:XOR 是按位进行的运算,这意味着你需要将两个数字转换为二进制形式,并对每一位分别进行 XOR 运算。

运算规则:

0 XOR 0 = 0
0 XOR 1 = 1
1 XOR 0 = 1
1 XOR 1 = 0

结果组合:将每一位的 XOR 运算结果组合起来,形成最终的二进制结果,然后可以将其转换回十进制。

示例
假设我们要计算 5 XOR 3:

转换为二进制:

5 的二进制是 101
3 的二进制是 011

按位进行 XOR 运算:

第一位(从右向左数):1 XOR 1 = 0
第二位:0 XOR 1 = 1
第三位:1 XOR 0 = 1
组合结果:

得到的二进制结果是 110

转换回十进制:

110 在二进制中对应的十进制数是 6
所以,5 XOR 3 的结果是 6

在编程中,你可以使用编程语言提供的 XOR 运算符(通常是 ^)来直接进行 XOR 运算,而不需要手动转换和执行每一位的运算。例如,在 Python 中,你可以这样计算:

result = 5 ^ 3
print(result) # 输出将是 6

2574. 左右元素和的差值

给你一个下标从 0 开始的整数数组 nums ,请你找出一个下标从 0 开始的整数数组 answer ,其中:

answer.length == nums.length
answer[i] = |leftSum[i] - rightSum[i]|
其中:

leftSum[i] 是数组 nums 中下标 i 左侧元素之和。如果不存在对应的元素,leftSum[i] = 0 。
rightSum[i] 是数组 nums 中下标 i 右侧元素之和。如果不存在对应的元素,rightSum[i] = 0 。
返回数组 answer 。

class Solution {
    public int[] leftRigthDifference(int[] nums) {
        int n = nums.length;
        int[] ans = new int[n];
        ans[0] = nums[0];
        for (int i = 1; i < n; ++i) {
            ans[i] = ans[i - 1] + nums[i];
        }
        for (int i = n - 1, rs = 0; i >= 0; rs += nums[i--]) {
            int ls = i == 0 ? 0 : ans[i - 1];
            ans[i] = Math.abs(ls - rs);
        }
        return ans;
    }
}

题解:(理解题目就很简单了)

示例
假设 nums = [1, 2, 3, 4]:

计算 leftSum:

leftSum[0] = 0(没有左侧元素)
leftSum[1] = 1(只有 1 左侧元素)
leftSum[2] = 3(1 + 2 左侧元素)
leftSum[3] = 6(1 + 2 + 3 左侧元素)
计算 rightSum:

rightSum[0] = 9(2 + 3 + 4 右侧元素)
rightSum[1] = 7(3 + 4 右侧元素)
rightSum[2] = 4(4 右侧元素)
rightSum[3] = 0(没有右侧元素)
计算 answer:

answer[0] = |0 - 9| = 9
answer[1] = |1 - 7| = 6
answer[2] = |3 - 4| = 1
answer[3] = |6 - 0| = 6
最终,answer 数组是 [9, 6, 1, 6]

101. 对称二叉树

给你一个二叉树的根节点 root , 检查它是否轴对称。
示例 1:
在这里插入图片描述

输入:root = [1,2,2,3,4,4,3]
输出:true

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public boolean isSymmetric(TreeNode root) {
  return check(root, root);
    }

    public boolean check(TreeNode p, TreeNode q) {
        if (p == null && q == null) {
            return true;
        }
        if (p == null || q == null) {
            return false;
        }
        return p.val == q.val && check(p.left, q.right) && check(p.right, q.left);

    }
}

LCP 06. 拿硬币

桌上有 n 堆力扣币,每堆的数量保存在数组 coins 中。我们每次可以选择任意一堆,拿走其中的一枚或者两枚,求拿完所有力扣币的最少次数。

示例 1:

输入:[4,2,1]

输出:4

解释:第一堆力扣币最少需要拿 2 次,第二堆最少需要拿 1 次,第三堆最少需要拿 1 次,总共 4 次即可拿完。

class Solution {
    public int minCount(int[] coins) {
        int sum = 0;
        for (int i : coins) {
            sum += (i + 1) / 2;
        }
        return sum;
    }
}

1365. 有多少小于当前数字的数字

简单
相关标签
相关企业
提示
给你一个数组 nums,对于其中每个元素 nums[i],请你统计数组中比它小的所有数字的数目。

换而言之,对于每个 nums[i] 你必须计算出有效的 j 的数量,其中 j 满足 j != i 且 nums[j] < nums[i] 。

以数组形式返回答案。

示例 1:

输入:nums = [8,1,2,2,3]
输出:[4,0,1,1,3]
解释:
对于 nums[0]=8 存在四个比它小的数字:(1,2,2 和 3)。
对于 nums[1]=1 不存在比它小的数字。
对于 nums[2]=2 存在一个比它小的数字:(1)。
对于 nums[3]=2 存在一个比它小的数字:(1)。
对于 nums[4]=3 存在三个比它小的数字:(1,2 和 2)。

class Solution {
    public int[] smallerNumbersThanCurrent(int[] nums) {
        int n = nums.length;
        int[] ret = new int[n];
        for (int i = 0; i < n; i++) {
            int cnt = 0;
            for (int j = 0; j < n; j++) {
                if (nums[j] < nums[i]) {
                    cnt++;
                }
            }
            ret[i] = cnt;
        }
        return ret;
    }
}

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

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

相关文章

org.springframework.context.ApplicationContext发送消息

1、创建消息的实体类 package com.demo;/*** 监听的实体类**/ public class EventMessage {private String name;public EventMessage(String name) {this.name name;}public String getName() {return name;}public void setName(String name) {this.name name;} }2、创建消…

three.js NDC空间转视图空间(getViewPosition)

three.js NDC空间转视图空间 NDC空间转视图空间, 比较常用。很多效果依赖于此。 包括: GTAOShaderReflectorForSSRPassSSRShader 下面看一下它的庐山真面目。 1、计算clipW 视图空间(view) 应用投影矩阵后转换到 剪裁空间(clip)。 [ A 0 B 0 0 C D 0 0 0 E F 0 0 − 1 0 ]…

Truenas scale 配置 Official Zerotier 并设置一直固定Zerotier IP

Zerotier 安装 TrueNAS Scale -> Apps -> Discover Apps -> 搜索 Zerotier 并安装Netwoek 中填入你 zerotier 网页中的的 Network IDAuto Token (API key) zerotier网页的 Account -> API Access Tokens -> New Tokenidentity.secret 和 identity.public 通过 …

国际化技术参考

一、概述 国际化就是用户可以选择对应的语言,页面展示成对应的语言; 一个系统的国际化按照信息的所在位置,可以分为三种国际化信息: 前端页面信息后端提示信息数据库的字典类信息二、前端页面国际化 使用i18n库实现国际化 i18n国际化库思路:通过jquery或者dom操作拿到需…

【动态规划】打家劫舍

动态规划的四个解题步骤&#xff1a; 1、定义子问题 2、写出子问题的递推关系 3、确定dp数组的计算顺序 4、空间优化&#xff08;可选&#xff09;上一篇博客学的有点杂乱&#xff0c;这一篇从解题步骤方面整理一下动态规划这一章。 打家劫舍&#xff08;难度&#xff1a;中等…

C++进阶中继承的全部主要内容

小编在学习完C中继承的内容之后&#xff0c;觉得继承的内容很重要&#xff0c;所以今天给大家带来的内容就是继承的主要内容&#xff0c;今天的内容包括继承的定义与语法&#xff0c;继承方式与权限&#xff0c;基类和派生类的类型转换赋值&#xff0c;继承中的隐藏&#xff0c…

数据跨境法案:美国篇下

数据跨境法案美国篇下主要介绍2018年《出口管制改革法案》(ECRA)、2018 年《外国投资风险审查现代化法案》(FIRRMA) 和《强化海外关键出口国家框架法》&#xff08;ENFORCE&#xff09;。其中 ECRA法案和 FIRRM 法案作为2019财年约翰S麦凯恩国家国防授权法&#xff08;NDAA&…

MySQL定时备份数据,并上传到oss

1.环境准备 1.安装阿里云的ossutil 2.安装mysql 2.编写脚本 脚本内容如下 #!/bin/bash # 数据库的配置信息&#xff0c;根据自己的情况进行填写 db_hostlocalhost db_usernameroot db_passwordroot db_namedb_root # oss 存贮数据的bucket地址 bucket_namerbsy-backup-buck…

开源发票识别InvoiceNet项目Windows部署踩坑记(1)

今天安装在github上的InvoiceNet开源项目&#xff0c;准备对它进行测试&#xff0c;安装过程出现了一些问题&#xff0c;做个记录&#xff0c;给遇到兄弟爬坑。 第一个问题&#xff0c;conda的问题&#xff0c; 这是另外一个包管理器&#xff0c;不仅仅可以管理python的虚拟…

如何通过smtp设置使ONLYOFFICE协作空间服务器可以发送注册邀请邮件

什么是ONLYOFFICE协作空间 ONLYOFFICE协作空间&#xff0c;是Ascensio System SIA公司出品的&#xff0c;基于Web的&#xff0c;开源的&#xff0c;跨平台的&#xff0c;在线文档编辑和协作的解决方案。在线Office包含了最基本的办公三件套&#xff1a;文档编辑器、幻灯片编辑…

XXE:XML外部实体引入

XXE漏洞 如果服务器没有对客户端的xml数据进行限制&#xff0c;且版本较低的情况下&#xff0c;就可能会产生xxe漏洞 漏洞利用流程 1.客户端发送xml文件&#xff0c;其中dtd存在恶意的外部实体引用 2.服务器进行解析 3.服务器返回实体引用内容 危害&#xff1a;任意文件读…

【C语言】 约瑟夫环,循环链表实现

1、循环链表实现约瑟夫环&#xff0c;每次经过特定步数删除一个元素 //looplist.h #ifndef LOOPLIST_H #define LOOPLIST_H #include<stdio.h> #include<string.h> #include<stdlib.h>typedef int datatype;typedef struct Node {union {int len;datatype d…

大模型应用—大模型赋能网络爬虫

大模型赋能网络爬虫 简单来说,网页抓取就是从网站抓取数据和内容,然后将这些数据保存为XML、Excel或SQL格式。除了用于生成潜在客户、监控竞争对手和市场研究外,网页抓取工具还可以用于自动化你的数据收集过程。 借助AI网页抓取工具,可以解决手动或纯基于代码的抓取工具的…

花几千上万学习Java,真没必要!(二十二)

1、final关键字&#xff1a; 测试代码1&#xff1a; package finaltest.com;public class FinalBasicDemo {public static void main(String[] args) {// final修饰基本数据类型变量final int number 5;// 尝试修改number的值&#xff0c;这将导致编译错误// number 10; // …

JAVA在线文档

1.存在码 JDK21中文API 2.全栈行动派 JDK17中文API 3.mklab.cn JDK11中文API JDK8中文API JDK7-21英文API 4.docs.oracle.com JDK7-22英文文档

Python实现文本转换为语音

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

探究Type-C接口的安装方式及应用场景

在现代电子设备中&#xff0c;Type-C接口因其高速传输、可逆插拔等特点&#xff0c;越来越受到用户的青睐。而Type-C接口的安装方式也是至关重要的一环&#xff0c;影响着设备的稳定性和可靠性。本文将深入分析Type-C接口的四种主要安装方式&#xff1a;表面贴片、穿孔焊接、夹…

【C++】内存管理的深度解析与实例

C内存管理的深度解析与实例 一、C内存管理的基本概念二、C内存分配方式1. 静态内存分配2. 动态内存分配 三、C内存管理的常见问题及解决策略1. 内存泄漏2. 堆内存碎片化3. 栈溢出 四、C内存管理的最佳实践1. 使用RAII&#xff08;Resource Acquisition Is Initialization&#…

图片转pdf的软件有哪些?这几种转换工具了解下

在日常的办公学习中&#xff0c;图片转PDF的需求愈发普遍。不论是工作汇报、学习笔记还是生活点滴&#xff0c;我们都希望将重要的图片内容整理成易于查阅的PDF格式。那么&#xff0c;有哪些软件可以做到将图片转换成PDF格式呢&#xff1f;给大家介绍5种简单好用的转换方法&…

昇思25天学习打卡营第17天|CycleGAN图像风格迁移互换

CycleGAN是一种非常酷的人工智能模型&#xff0c;它能够在没有成对训练样本的情况下&#xff0c;将一种图像风格迁移到另一种图像上。比如&#xff0c;你可以把苹果的图片变成橘子的风格&#xff0c;反之亦然。 CycleGAN的网络结构&#xff0c;包括生成器和判别器&#xff0c;它…