当前位置: 首页 > news >正文

【LeetCode题目详解】1281题 整数的各位积和之差 面试题 01.01. 判定字符是否唯一 python题解(作业一二)

本文章以python为例!

一、力扣第1281题:整数的各位积和之差

问题描述:

1281. 整数的各位积和之差

给你一个整数 n,请你帮忙计算并返回该整数「各位数字之积」与「各位数字之和」的差。

示例 1:

输入:n = 234

输出:15

解释:

各位数之积 = 2 * 3 * 4 = 24

各位数之和 = 2 + 3 + 4 = 9

结果 = 24 - 9 = 15

示例 2:

输入:n = 4421

输出:21

解释:

各位数之积 = 4 * 4 * 2 * 1 = 32

各位数之和 = 4 + 4 + 2 + 1 = 11

结果 = 32 - 11 = 21

提示:

1 <= n <= 10^5

 解题思路:把n的数值转换为字符串,然后分成一个一个的,方便逐位处理。然后逐个遍历,最后用乘积减去和,返回结果。

算法描述:

初始化两个变量 x 和 y 分别为1和0,用来分别表示各位数字之积和各位数字之和。

将整数 n 转换为字符串 a,方便逐位处理。

遍历字符串 a 中的每个字符,每次迭代都执行以下步骤: a. 将当前字符转换为整数 s。 b. 计算 x *= s,将当前字符的值与 x 相乘,更新各位数字之积。 c. 计算 y += s,将当前字符的值与 y 相加,更新各位数字之和。

循环结束后,计算 result = x - y,得到各位数字之积与各位数字之和的差值。

返回 result 作为最终结果。

时间复杂度分析:

这个算法的时间复杂度取决于整数 n 的位数,设 n 有 k 位数字。因为需要将 n 转换成字符串,并且对每个位上的数字进行遍历,所以时间复杂度为 O(k)。

题解:

class Solution:def subtractProductAndSum(self, n: int) -> int:x=1y=0a=str(n)for b in a:s=int(b)x*=sy+=sresult=x-yreturn result

 讨论与总结:

这是一道较为简单的算法题目,很容易就有解题思路,但是用的是python,习惯了c语言的代码编程,有点不适应,经过这道题目,初步掌握了python的一些基础代码。

 - 力扣提交结果(截图贴到答案框,截图应该能看到你的代码以及提交记录)

二、力扣:面试题 01.01. 判定字符是否唯一

题目:

实现一个算法,确定一个字符串 s 的所有字符是否全都不同。

示例 1:

输入: s = "leetcode"
输出: false 

示例 2:

输入: s = "abc"
输出: true

限制:

  • 0 <= len(s) <= 100
  • s[i]仅包含小写字母
  • 如果你不使用额外的数据结构,会很加分。

方法一:

解题方法

利用set特性去重,再与原字符串比较长度是否相等。

class Solution:def isUnique(self, astr: str) -> bool:return len(set(astr)) == len(astr)

这段代码的工作原理:

  1. class Solution::这行代码定义了一个名为Solution的类。这个类通常用于封装解决特定问题的方法和功能。

  2. def isUnique(self, astr: str) -> bool::这是Solution类中的一个方法定义。它声明了一个名为isUnique的方法,接受一个参数astr,该参数是一个字符串,并且返回一个布尔值(-> bool表示返回值类型为布尔型)。

  3. return len(set(astr)) == len(astr):这是isUnique方法的实现。它使用了Python中的一些内置函数和数据结构来判断字符串中的字符是否都是唯一的。具体步骤如下:

    • set(astr):首先,将输入字符串astr转换为一个集合(set)。集合是一种无序、不重复的数据结构,它会自动去除重复的元素,只保留唯一的元素。

    • len(set(astr)):接下来,计算集合的长度,也就是集合中唯一元素的个数。

    • len(astr):同时,计算原始字符串astr的长度,也就是字符串中字符的总个数。

    • len(set(astr)) == len(astr):最后,将集合的长度与原始字符串的长度进行比较。如果它们相等,说明字符串中的字符都是唯一的,此时返回True;否则,返回False

这个代码的核心思想是,如果一个字符串中的字符都是唯一的,那么将字符串转换为集合后,集合的长度应该与原始字符串的长度相等。如果有重复的字符存在,集合的长度会小于原始字符串的长度,因此返回False,表示字符串中存在重复字符。否则,返回True,表示字符串中的字符全部都是唯一的。这是一种简洁而有效的方法来解决判断字符串中字符唯一性的问题。

方法二:

解题思路

一看到题目想到的就是直接暴力,使用双重循环,逐一比较字符串中的字符是否相同。如果在任何时候找到相同的字符,就返回 False,否则在遍历完成后返回 True,表示字符串中的字符全部都是唯一的。这种实现方式没有使用额外的数据结构,适用于不使用额外空间的情况。

 算法描述(可以使用代码加注释、伪代码、纯文字描述均可)、时间复杂度分析

算法描述:class Solution:

    def isUnique(self, astr: str) -> bool:

        # 使用双重循环来比较字符是否相同

        for i in range(len(astr)):

            for j in range(i + 1, len(astr)):

                if astr[i] == astr[j]:

                    return False

        # 如果没有找到相同的字符,返回True

        return True

时间复杂度分析:这个算法的时间复杂度是O(n^2),其中n是字符串s的长度。

该算法使用了双重循环来比较字符串中的字符是否相同。外层循环需要遍历整个字符串,内层循环从外层循环的下一个字符开始遍历剩余字符。因此上述算法的时间复杂度为O(n^2)。

 题解

class Solution:def isUnique(self, astr: str) -> bool:for i in range(len(astr)):for j in range(i + 1, len(astr)):if astr[i] == astr[j]:return Falsereturn True

 讨论与总结

直接暴力时间复杂度比较高,而且没有什么学习价值,但是学习到了python的双重循环是怎么样写的。

方法三:

用Python编写一个不使用额外数据结构的算法来确定一个字符串的所有字符是否都不相同。一种方法是使用双重循环,但这不是最优解。更好的方法是使用位运算,因为你知道输入字符串只包含小写字母。

以下是一个示例代码,使用位运算来检查字符串是否包含重复字符:

class Solution:def isUnique(self, astr: str) -> bool:# 创建一个用于存储出现过的字符的位向量,初始值为0char_set = 0for char in astr:# 计算字符的ASCII码值char_val = ord(char)# 使用位运算检查字符是否已经出现过if (char_set & (1 << char_val)) > 0:return False# 将对应字符位置的位设为1char_set |= (1 << char_val)return True# 创建Solution类的实例
solution = Solution()# 示例
print(solution.isUnique("leetcode"))  # 输出: False
print(solution.isUnique("abc"))       # 输出: True

下面是对代码的详细解释:

  1. 我们首先定义了一个名为 Solution 的类,该类包含了一个名为 isUnique 的方法,该方法接受一个字符串 astr 作为输入,并返回一个布尔值,指示字符串中的字符是否都是唯一的。

  2. 在 isUnique 方法内部,我们创建了一个名为 char_set 的整数变量,用于存储出现过的字符的信息。初始时,char_set 的所有位都被设置为0,因为我们还没有遇到任何字符。

  3. 接下来,我们使用 for 循环遍历输入字符串 astr 中的每个字符。

  4. 对于每个字符,我们使用 ord(char) 来获取其对应的ASCII码值,这个值将用于确定该字符在 char_set 中的位置。

  5. 我们使用位运算来检查字符是否已经出现过。具体做法是将1左移 char_val 位,并与 char_set 进行按位与运算。如果结果大于0,说明该字符已经出现过,因此我们返回 False 表示字符串中有重复字符。

  6. 如果字符没有重复,我们将更新 char_set,将对应字符位置的位设为1,以表示该字符已经出现过。这是通过将1左移 char_val 位并与 char_set 进行按位或运算来实现的。

  7. 最终,如果我们遍历完整个字符串而没有发现重复字符,那么我们返回 True,表示字符串中的所有字符都是唯一的。

这个算法的核心思想是使用一个整数的二进制位来表示每个字符是否出现过,以达到空间复杂度O(1)的要求。同时,它的时间复杂度为O(n),其中n是字符串的长度,因为我们需要遍历整个字符串。

注释:ord()函数

ord()函数是一个内置的Python函数,用于获取一个字符的Unicode码点(整数表示)。Unicode是一种用于表示世界上大多数字符的标准编码系统,包括ASCII字符和许多其他字符,因此ord()` 函数可以用于获取字符的唯一整数标识。

具体来说,ord() 函数接受一个字符作为参数,并返回该字符对应的Unicode码点,例如

char = 'A'
unicode_value = ord(char)
print(unicode_value)  # 输出: 65

在上面的示例中,ord('A') 返回65,因为大写字母"A"的Unicode码点是65。

ord() 函数通常在需要将字符与其相应的整数表示进行比较或转换时使用。与之相反的函数是 chr(),它接受一个整数(Unicode码点)作为参数,并返回对应的字符。这两个函数一起允许在字符和整数之间进行。

通过一个具体的示例来演示这个方法的整个过程,以便理解:

假设输入字符串 astr 为 "abcabc"。

  1. 我们首先创建一个整数 char_set,初始值为0,用于表示字符的出现状态。

  2. 开始遍历字符串 astr 的字符:

    • 对于第一个字符 'a',其Unicode码点为97,我们计算 char_val = ord('a'),因此 char_val 等于 97。

    • 我们检查 char_set 中的位,看看字符 'a' 是否已经出现过。首先,我们将 1 左移 char_val 位,得到一个二进制数,只有第 97 位为1,其他位都为0,即 1 << 97 等于 158456325028528675187087900672。然后,我们使用按位与运算来检查这一位是否已经被设置在 char_set 中,即 char_set & (1 << char_val)。由于 char_set 的初始值为0,按位与的结果也为0,表示字符 'a' 还没有出现过。

    • 接下来,我们将更新 char_set,将字符 'a' 对应的位设为1,使用按位或运算,即 char_set |= (1 << char_val)。此时,char_set 的值变为 158456325028528675187087900672,表示字符 'a' 已经出现过。

  3. 然后,我们继续遍历字符串的下一个字符 'b',并重复相同的过程。

    • 计算 char_val = ord('b'),得到 char_val 等于 98。

    • 使用按位与运算检查字符 'b' 是否已经出现过,即 char_set & (1 << char_val)。此时,由于 char_set 的第 97 位已经被设置为1,按位与的结果不再是0,表示字符 'b' 已经出现过。

    • 由于字符 'b' 已经出现过,我们不再更新 char_set,继续遍历下一个字符 'c'。

  4. 对于字符 'c',我们执行相同的过程:

    • 计算 char_val = ord('c'),得到 char_val 等于 99。

    • 使用按位与运算检查字符 'c' 是否已经出现过,即 char_set & (1 << char_val)。此时,由于 char_set 的第 97 和 98 位都已经被设置为1,按位与的结果不再是0,表示字符 'c' 已经出现过。

    • 由于字符 'c' 已经出现过,我们不再更新 char_set

  5. 最后,我们遍历完整个字符串,发现字符串中有重复字符 'a'、'b' 和 'c',因此函数返回 False 表示字符串中不是所有字符都唯一。

这就是使用位运算检查字符串中是否有重复字符的过程。通过将字符的Unicode码点映射到整数,并使用位运算来表示字符的出现状态,我们可以高效地解决这个问题。

相关文章:

【LeetCode题目详解】1281题 整数的各位积和之差 面试题 01.01. 判定字符是否唯一 python题解(作业一二)

本文章以python为例! 一、力扣第1281题&#xff1a;整数的各位积和之差 问题描述&#xff1a; 1281. 整数的各位积和之差 给你一个整数 n&#xff0c;请你帮忙计算并返回该整数「各位数字之积」与「各位数字之和」的差。 示例 1&#xff1a; 输入&#xff1a;n 234 输出…...

1.12 进程注入ShellCode套接字

在笔者前几篇文章中我们一直在探讨如何利用Metasploit这个渗透工具生成ShellCode以及如何将ShellCode注入到特定进程内&#xff0c;本章我们将自己实现一个正向ShellCodeShell&#xff0c;当进程被注入后&#xff0c;则我们可以通过利用NC等工具连接到被注入进程内&#xff0c;…...

MySQL 日志系统

重要日志模块 日志文件bin logredo log**关于循环写入和擦除的checkpoint 规则**redo log 怎么刷入磁盘的 binlog 和 redo log 有什么区别&#xff1f;undo log 日志文件 错误日志&#xff08;error log&#xff09;&#xff1a; 错误日志文件对 MySQL 的启动、运行、关闭过程进…...

LeetCode刷题---Two Sum(一)

文章目录 &#x1f340;题目&#x1f340;解法一&#x1f340;解法二&#x1f340;哈希表 &#x1f340;题目 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每…...

算法通关村第十七关——插入区间

LeetCode435,给定一个区间的集合&#xff0c;找到需要移除区间的最小数量&#xff0c;使剩余区间互不重叠。 示例1&#xff1a; 输入&#xff1a;interva1s[[1,3],[6,9]],newInterva1[2,5] 输出&#xff1a;[[1,5]&#xff0c;[6,9]] 解释&#xff1a;新区间[2,5]与[1,3]重…...

Jenkins java8安装版本安装

一、首先准备Jenkins、Jdk8、Tomcat9安装包 根据Jenkins官网介绍&#xff0c;Jenkins支持Java8的版本如下&#xff1a; 我们选择2.164版本进行安装&#xff0c;根据版本号支持输入下载地址&#xff1a;https://archives.jenkins.io/war/2.164/jenkins.war&#xff0c;进行下载…...

线上问诊:数仓开发(二)

系列文章目录 线上问诊&#xff1a;业务数据采集 线上问诊&#xff1a;数仓数据同步 线上问诊&#xff1a;数仓开发(一) 线上问诊&#xff1a;数仓开发(二) 文章目录 系列文章目录前言一、DWS1.最近1日汇总表1.交易域医院患者性别年龄段粒度问诊最近1日汇总表2.交易域医院患者…...

Ansible自动化运维工具(三)

目录 Ansible 的脚本 --- playbook 剧本 ​编辑2.vars模块实战实例 3.指定远程主机sudo切换用户 4.when模块实战实例 5.with_items迭代模块实战实例 6.Templates 模块实战实例 &#xff08;1&#xff09;先准备一个以 .j2 为后缀的 template 模板文件&#xff0c;设置引用…...

ChatGPT在创新和创业中的应用如何?

ChatGPT是一种基于大规模预训练的语言模型&#xff0c;它在创新和创业中有着广泛的应用。作为一种具备自然语言处理能力的模型&#xff0c;ChatGPT可以与用户进行对话&#xff0c;并提供相关的信息、建议和创意。以下是ChatGPT在创新和创业中的一些应用&#xff1a; 创意生成和…...

Log4j2 配置日志记录发送到 kafka 中

前言 log4j2 在 2.11.0 之后的版本&#xff0c;已经内置了 KafkaAppender 支持可以将打印的日志直接发送到 kafka 中&#xff0c;在这之前如果想要集中收集应用的日志&#xff0c;就需要自定义一个 Layout 来实现&#xff0c;相对来说还是比较麻烦的。 官网文档&#xff1a;L…...

Linux用户与组管理(03)(八)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、组管理 1、概述 2、用户信息查看 总结 前言 今天是学习用户与组管理的最后一节课&#xff0c;这节课主要是组管理的内容&#xff0c;希望能一起学习&#xff…...

Java自定义异常

Java标准库定义的常用异常包括&#xff1a; 当我们在代码中需要抛出异常时&#xff0c;尽量使用JDK已定义的异常类型。例如&#xff0c;参数检查不合法&#xff0c;应该抛出IllegalArgumentException&#xff1a; static void process1(int age) {if (age < 0) {throw new…...

vscode远程调试php

使用vscode远程调试php的方法 1.安装remote ssh插件 2.连接服务器 可以点击左下角的绿色按钮&#xff0c;或者ctrlshiftp打开命令框输入remote ssh应该也有。 3.在服务器端vscode安装php debug插件 4.安装xdebug xdebug是用来调试php的软件&#xff0c;原本和vscode没什么关…...

C语言:截断+整型提升练习

详情关于整型提升与截断见文章&#xff1a;《C语言&#xff1a;整型提升》 一、代码一 int main() { char a -1; signed char b -1; unsigned char c -1; printf("%d %d %d", a, b, c); return 0; } 求输出结果 解析如下代码&#xff1a; int mai…...

Kubernetes技术--k8s核心技术kubectl命令行工具

(1).概述 kubectl是Kubernetes集群的命令行工具,通过 kubectl 能够对集群本身进行管理,并能够在集群上进行容器化应用的安装部署。 (2).语法 Kubectl [command] [type] [name] [flags] 语法参数说明: command: 指定要对资源执行的操作,例如 create、get、describe 和 delet…...

Element浅尝辄止9:Popover 弹出框组件

Popover 的属性与 Tooltip 很类似&#xff0c;它们都是基于Vue-popper开发的&#xff0c;因此有重复属性 1.如何使用&#xff1f; /*trigger属性用于设置何时触发 Popover&#xff0c;支持四种触发方式&#xff1a; hover&#xff0c;click&#xff0c;focus 和 manual。 对于…...

程序开发:构建功能强大的应用的艺术

程序开发是在今天的数字化时代中扮演重要角色的一项技术。通过编写代码&#xff0c;开发人员能创造出无数不同的应用&#xff0c;从简单的计算器到复杂的社交平台。电子商务应用、在线教育平台、医疗记录系统等&#xff0c;都重视程序开发的重要性&#xff0c;通过这其中的交互…...

(七)k8s实战-高级调度

一、CronJob 定时任务 1、cron 表达式 # ┌───────────── 分钟 (0 - 59) # │ ┌───────────── 小时 (0 - 23) # │ │ ┌───────────── 月的某天 (1 - 31) # │ │ │ ┌───────────── 月份 (1 - 12) # │ │ │ │ ┌…...

HTTP/1.1协议中的八种请求

2023年8月29日&#xff0c;周二晚上 目录 概述八种请求GET请求POST请求PUT请求PATCH请求DELETE请求HEAD请求OPTIONS请求TRACE请求 概述八种请求 HTTP/1.1协议中定义了8种常用的请求方法,分别是:1. GET 用途:请求指定的页面信息,并返回实体主体。例子:获取一个网页、图片等静态…...

面试系列 - JVM内存模型和调优详解

目录 一、JVM内存模型 1. 程序计数器&#xff08;Program Counter Register&#xff09;&#xff1a; 2.Java虚拟机栈&#xff08;Java Virtual Machine Stacks&#xff09;&#xff1a; 3. 本地方法栈&#xff08;Native Method Stack&#xff09;&#xff1a; 5. 方法区…...

JavaScript -【第一周】

文章来源于网上收集和自己原创&#xff0c;若侵害到您的权利&#xff0c;请您及时联系并删除~~~ JavaScript 介绍 变量、常量、数据类型、运算符等基础概念 能够实现数据类型的转换&#xff0c;结合四则运算体会如何编程。 体会现实世界中的事物与计算机的关系理解什么是数据并…...

高性能缓存 Caffeine 原理及实战

Caffeine 是基于Java 8 开发的、提供了近乎最佳命中率的高性能本地缓存组件&#xff0c;Spring5 开始不再支持 Guava Cache&#xff0c;改为使用 Caffeine。 1 算法原理 对于 Java 进程内缓存我们可以通过 HashMap 来实现。不过&#xff0c;Java 进程内存是有限的&#xff0c;…...

【算法】leetcode 105 从前序与中序遍历序列构造二叉树

题目 输入某二叉树的前序遍历和中序遍历的结果&#xff0c;请构建该二叉树并返回其根节点。 假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 示例 1: Input: preorder [3,9,20,15,7], inorder [9,3,15,20,7] Output: [3,9,20,null,null,15,7]示例 2: Input: pr…...

11 | Spark计算数据文件中每行数值的平均值

需求:计算数据文件中的数值的平均值 背景: 你有一个数据文件,其中包含一系列数值,每行一个数值,数值之间用逗号分隔。你想使用Apache Spark分布式计算框架来读取数据文件中的数值并计算它们的平均值。功能要求: 通过Spark配置和上下文初始化Spark应用程序。从数据文件中…...

AI与游戏创新:深度学习的起跑枪声

《AI与游戏创新&#xff1a;深度学习的起跑枪声》 目录 引言AIGC定义与重要性AI在游戏中的应用AI推动游戏创新的可能途径AIGC的挑战与解决方案结论&#xff1a;AI是游戏行业的下一站 引言 AI&#xff08;人工智能&#xff09;正在全球范围内改变各个行业&#xff0c;游戏行…...

【GUI开发】用python爬YouTube博主信息,并开发成exe软件

文章目录 一、背景介绍二、代码讲解2.1 爬虫2.2 tkinter界面2.3 存日志 三、软件演示视频四、说明 一、背景介绍 你好&#xff0c;我是马哥python说&#xff0c;一名10年程序猿。 最近我用python开发了一个GUI桌面软件&#xff0c;目的是爬取相关YouTube博主的各种信息&#…...

7.6 函数的递归调用

直接调用&#xff1a; ### 1. 直接递归调用 直接递归调用是指一个函数直接调用自己。例如&#xff0c;计算阶乘的函数&#xff0c;可以使用递归方法&#xff1a; int factorial(int n) {if (n < 1) {return 1;}return n * factorial(n - 1); } 在这个例子中&#xff0c;f…...

本地开机启动jar

1&#xff1a;首先有个可运行的jar包 本地以ruiyi代码为例打包 2&#xff1a;编写bat命令---命名为.bat即可 echo off java -jar D:\everyDay\test\RuoYi\target\RuoYi.jar 3&#xff1a;设置为开机自启动启动 快捷键winr----输入shell:startup---打开启动文档夹 把bat文件复…...

解决uniapp手机真机调试时找不到手机问题

1、检查 USB 调试是否开启 2、检查是否有选择 文件 传输 选项 3、如果上述都做了还找不到&#xff0c;可以看看开发者选项中的【USB设置】&#xff0c;把模式改为 MIDI 模式...

HarmonyOS应用开发者-----高级认证试题及答案

HarmonyOS应用开发者高级认证试题及答案 试题会不定时刷新,本试题仅供大家学习参考 【判断题】 2/2 HarmonyOS应用可以兼容OpenHarmony生态 正确(True)【判断题】 2/2 所有使用@Component修饰的自定义组件都支持onPageShow,onBackPress和onPageHide生命周期函数。 正确(True…...

林州企业网站建设/连接交换

目录1.springboot简介2.REST风格1.简介2.RESTful3.复制工程4.属性配置1.application.properties2.application.yml、.yaml3.关于写配置文件的时候没有提示的解决方案4.yaml1.语法格式2.读取数据3.封装对象5.整合第三方技术1.整合Junit1.实现2.注意事项2.整合mybatis3.整合mybat…...

网站优化排名如何做/百度seo官网

在win10系统中我们经常需要会需要进行系统更新&#xff0c;都会提示需要重启才会生效&#xff0c;但是有用户发现重启后还是没有安装更新&#xff0c;那么遇到Win10更新系统后重启电脑没反应怎么回事呢&#xff1f;今天小编就教大家怎么来解决这个问题吧&#xff01;方法一&…...

手表怎么在网站做推广/南昌seo方案

Silverlight 有没有对 FLV 视频提供支持&#xff1f; 好吧&#xff0c;所有的开发人员都是懒惰的&#xff0c;ME2。先查查微软的文档吧&#xff0c;FLV 视频是如此的普及&#xff0c;没准儿微软已经在 Silverlight 中提供了对 FLV 视频的支持。 结果&#xff0c;微软在 Silve…...

拍卖网站建设公司/seo项目完整流程

...

找人一起做素材网站/谷歌推广开户多少费用

这两天老大让我写一个让照片翻转的效果&#xff0c;甚是痛苦&#xff0c;下面是我的一些个人心得 在W3C官方的标准里&#xff0c;通过transform属性使对象旋转的写法如下&#xff1a;transform: rotate(40deg); /* 其中40是旋转的角度 */ 可是由于目前几乎所有的浏览器对这个属…...

临沂网站/百度推广登录平台网址

1.1.1. 引设计原则 1&#xff0e;原则上表索引的个数不能超过5个&#xff1b; 2&#xff0e;原则上单个字段上的索引不能超过2个&#xff1b; 3&#xff0e;原则上复合索引引用的字段不能超过3个字段&#xff1b; 4&#xff0e;原则上分区表的索引类型全部使用LOCAL索引&am…...