Leetcode 16.07 最大数值

编写一个方法,找出两个数字ab中最大的那一个。不得使用if-else或其他比较运算符。

示例:

输入: a = 1, b = 2
输出: 2

我的答案:

为了找出两个数中的较大者,而不使用比较或条件语句,我们可以使用数学和位操作。

二、分析

当我看到这道题目时,我马上意识到这是一个不同寻常的问题,因为它禁止使用我们通常用来比较数字的工具。以下是我在思考这道题时的思考和分析过程:

1. **理解题目要求**:首先,我需要确保我完全理解题目的要求。它明确要求不使用比较运算符或条件语句。这意味着我们不能直接使用`if-else`、三元操作符或`switch`。

2. **基本思考**:在不使用比较或条件运算符的情况下,如何比较两个数呢?直观地说,差值可以告诉我们很多信息。`a-b`的结果可以告诉我们`a`和`b`之间的关系,但是如何解释这个差值是关键。

3. **探索位操作**:当我考虑不使用标准比较工具时,我会想到位操作,因为它提供了一种直接操作整数的低级方法。这提示了一个方向:可以检查`a-b`的符号位来确定`a`和`b`的关系。

4. **分析整数的表示**:在二进制补码表示中,一个整数的最高位(在32位系统中为第31位)是其符号位。如果这个位是1,那么这个数是负数;如果是0,那么这个数是正数。

5. **提取符号位**:基于上面的知识,我们可以通过右移操作来获取这个符号位,并使用`AND`操作来提取它。

6. **利用符号位进行选择**:一旦我们有了符号位,就可以利用它来选择`a`或`b`。如果`a-b`是正数(符号位为0),则`a`是较大的数;如果是负数(符号位为1),则`b`是较大的数。

7. **实现并测试**:基于以上的思考,我编写了解决方案并进行了测试。在实际编写代码时,我确保避免了任何可能的整数溢出,并确保代码能够正确处理所有边缘情况。

总的来说,这个问题要求我们以一种新的、非传统的方式来思考比较操作。这样的问题强调了基础计算机科学知识(如整数的二进制表示和位操作)的重要性,并提供了应用这些知识的机会。

三、演绎推理过程

当然可以,以下是针对这个问题的演绎推理过程:

1. **开始假设**:假设我们有两个数`a`和`b`,我们的目标是确定哪个数更大,但我们不能直接比较它们。

2. **关于差值的推论**:考虑到差值`a-b`,如果`a`大于`b`,那么差值是正的;如果`a`小于`b`,那么差值是负的;如果`a`等于`b`,那么差值是0。

3. **符号位的重要性**:由于我们不能直接查看差值(因为这本身就是一个比较),我们需要找到一种方式来仅仅判断这个差值的正负。这时,符号位变得重要。在一个32位的整数中,最高位(第31位)表示符号:0代表正,1代表负。

4. **提取符号位**:如果我们将差值右移31位,我们可以将符号位放到最低位位置。接下来,我们可以使用AND操作与1来确保我们只获取这个符号位,其他位都是0。

5. **使用符号位决策**:一旦我们有了符号位,我们可以利用它为我们做决策。如果符号位是0(表示`a-b`是正数),我们知道`a`是较大的数。如果符号位是1(表示`a-b`是负数),那么`b`是较大的数。

6. **总结方程**:结合上述推论,我们得到了以下的关系:
   - 如果`a-b`为正,返回`a`。
   - 如果`a-b`为负,返回`b`。
   而这完全可以通过表达式`a - sign * (a-b)`来表示,其中`sign`是我们从步骤4中得到的符号位。

7. **边界情况**:在这种情况下,当`a`和`b`相等时,差值为0,其符号位为0,所以返回`a`。这也满足了预期的结果。

通过这种逻辑和演绎的推理,我们能够在不直接比较两个数的情况下确定它们之间的大小关系。这种推理过程显示了如何通过理解整数的底层表示和使用位操作来解决看似复杂的问题。

方法思路:

1. 计算`diff = a - b`。
2. 判断`diff`的符号位。在32位整数中,符号位是最高位。如果`diff`为正,那么`a`大;如果为负,那么`b`大。
3. 使用位操作获取`diff`的符号位。

下面是实现这一思路的代码:

### C语言:

#include <stdio.h>int maximum(int a, int b) {int diff = a - b;int sign = (diff >> 31) & 1;  // 获取diff的符号位return a - sign * diff;       // 如果diff为正,sign = 0, 返回a; 如果diff为负,sign = 1, 返回b
}int main() {int a = 1, b = 2;printf("Maximum: %d\n", maximum(a, b));return 0;
}

### C++:

#include <iostream>int maximum(int a, int b) {int diff = a - b;int sign = (diff >> 31) & 1;  // 获取diff的符号位return a - sign * diff;       // 如果diff为正,sign = 0, 返回a; 如果diff为负,sign = 1, 返回b
}int main() {int a = 1, b = 2;std::cout << "Maximum: " << maximum(a, b) << std::endl;return 0;
}

### Java:

public class MaximumNumber {public static int maximum(int a, int b) {int diff = a - b;int sign = (diff >> 31) & 1;  // 获取diff的符号位return a - sign * diff;       // 如果diff为正,sign = 0, 返回a; 如果diff为负,sign = 1, 返回b}public static void main(String[] args) {int a = 1, b = 2;System.out.println("Maximum: " + maximum(a, b));}
}

这种方法基于整数在计算机中的二进制表示,以及我们可以通过位操作来提取和操作这些二进制位的事实。

英雄师傅答案:

C语言:

int maximum(int a, int b){return a>b?a:b;
}

总结:

这道题目在初看下似乎很简单,但它隐藏了许多有趣和重要的编程和计算机科学原理。从这个问题中,我们可以学习以下几点:

1. **解题的多样性**:即使对于看似简单的问题,也可能有多种解决方法。这强调了在实际工作中对问题进行全面思考的重要性。

2. **计算机的底层工作原理**:通过禁止使用常规的比较运算符,问题鼓励我们使用更低级的操作(如位操作)来解决问题。这提醒我们,高级的编程语言和操作(如比较运算符)在底层是如何实现的。

3. **位操作的强大之处**:位操作不仅在性能上很有优势(尽管现代编译器的优化已经非常好),而且能够提供解决问题的独特方法,这些方法在使用常规方法时可能不会立即显现。

4. **阅读题目的重要性**:这是一个很好的例子,说明为什么仔细阅读和理解题目要求是如此关键。可能会有一种直观的方法来解决问题,但如果不满足所有条件,则需要更深入地思考。

5. **编程的创新性**:有时,通常的方法可能不适用或不可用。这种情况下,需要发挥创意来找到新的解决方案。

6. **安全性与健壮性**:当实施某些位操作或其他技巧时,很容易遇到其他问题,如整数溢出。因此,考虑到所有可能的边缘情况和问题是很重要的。

7. **计算思维的训练**:考虑如何在不使用明显的工具或方法的情况下解决问题可以帮助强化和扩展我们的计算思维能力。

总之,这道题目是对我们在编程、算法和计算思维方面能力的一个很好的测试,并提醒我们在编程中要保持开放和创新的思维。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

常见的几种排序算法

目录 一、插入排序 1、直接插入排序 1.1、排序方法 1.2、图解分析 1.3、代码实现 2、希尔排序 2.1、排序方法 2.2、图解分析 2.3、代码实现 二、选择排序 1、直接选择排序 1.1、排序方法 1.2、图解分析 1.3、代码实现 2、堆排序 2.1、排序方法 2.2、图解分析 …

视频监控/视频汇聚/视频云存储EasyCVR平台接入国标GB协议后出现断流情况,该如何解决?

视频监控汇聚平台EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。安防监控平台EasyCVR既具备传统安防视频监控的能…

优思学院|亲和图案例:寻找六西格玛的项目

什么是亲和图&#xff1f; 亲和图&#xff08;Affinity Diagram&#xff09;主要功能在於分类归纳&#xff0c;协助在一堆杂乱无章的资料之中&#xff0c;有系统的归纳出几个大类&#xff0c;以利后续作业。通常先利用头脑风暴&#xff08;Brainstorming&#xff09;方式得到大…

K8S:K8S自动化运维容器

目录 一.k8s概述 2.为什么要用K8S 3.作用及功能 4.k8s容器集群管理系统 二.K8S的特性 1.弹性伸缩 2.自我修复 3.服务发现和复制均衡 4.自动发布和回滚 5.集中化配置管理和秘钥管理 6.存储编排 7.任务批量处理运行 三.K8S的集群架构 四.K8S的核心组件 1.Master组件 …

命令执行漏洞复现攻击:识别威胁并加强安全

环境准备 这篇文章旨在用于网络安全学习&#xff0c;请勿进行任何非法行为&#xff0c;否则后果自负。 一、攻击相关介绍 原理 主要是输入验证不严格、代码逻辑错误、应用程序或系统中缺少安全机制等。攻击者可以通过构造特定的输入向应用程序或系统注入恶意代码&#xff…

计算机网络的故事——HTTP报文内的HTTP信息

HTTP报文内的HTTP信息 文章目录 HTTP报文内的HTTP信息一、HTTP 报文二、请求报文及响应报文的结构三、编码提升传输速率 一、HTTP 报文 HTTP报文是由多行&#xff08;CRLF作换行符&#xff09;数据构成的字符串文本&#xff0c;HTTP报文可以分为报文首部和报文主体两部分&…

数据结构(一)Trie字符串统计

目录 代码 &#xff08;一&#xff09;输入cat son[p][u],p表示儿子&#xff0c;u表示第几个儿子 0的根的节点编号为idx -------------------------------------------------------- 根是0的有个儿子c&#xff0c;编号为1的节点有个子节点为a&#xff0c;a的编号是2&#xf…

Mybatis 动态SQL – 使用choose标签动态生成条件语句

之前我们介绍了if,where标签的使用&#xff1b;本篇我们需要在if,where标签的基础上介绍如何使用Mybatis提供的choose标签动态生成条件语句。 如果您对if,where标签动态生成条件语句不太了解&#xff0c;建议您先进行了解后再阅读本篇&#xff0c;可以参考&#xff1a; Mybat…

解决C++ 遇笔试题输入[[1,2,3,...,],[5,6,...,],...,[3,1,2,...,]]问题

目录 0 引言1 思路2 测试结果3 完整代码4 总结 0 引言 现在面临找工作问题&#xff0c;做了几场笔试&#xff0c;遇到了一个比较棘手的题目就是题目输入形式如下&#xff1a; [ [3,1,1], [3,5,3], [3,2,1] ] 当时遇到这个问题还是比较慌的&#xff0c;主要是之前没有遇到这样的…

内网穿透实战应用-如何通过内网穿透实现远程发送个人本地搭建的hMailServer的邮件服务

文章目录 1. 安装hMailServer2. 设置hMailServer3. 客户端安装添加账号4. 测试发送邮件5. 安装cpolar6. 创建公网地址7. 测试远程发送邮件8. 固定连接公网地址9. 测试固定远程地址发送邮件 hMailServer 是一个邮件服务器,通过它我们可以搭建自己的邮件服务,通过cpolar内网映射工…

智慧园区能源管理系统可以本地私有化部署吗?

答案是肯定的&#xff0c;智慧园区能源管理系统可以本地私有化部署! 随着社会的发展和经济的增长&#xff0c;能源消耗逐渐成为影响社会发展的重要因素。为了更好地管理能源&#xff0c;提高能源利用效率&#xff0c;降低能源消耗成本&#xff0c;智慧园区能源管理系统应运而生…

Go语言在机器学习中有未来吗?

Go 是一种开源编程语言&#xff0c;最初由 Google 设计&#xff0c;用于优化系统级服务的构建和使用、在大型代码库上轻松工作&#xff0c;以及利用多核联网机器。 Go 于 2009 年推出&#xff0c;作为一种静态类型和编译型编程语言&#xff0c;深受 C 语言的影响&#xff0c;注…

idea 无法识别maven的解决

问题描述 从git拉取代码或者修改文件夹以后&#xff0c;整个项目所有依赖爆红无法通过修改或者重新加载maven解决版本为idea 2021 问题定位 maven的版本太高&#xff0c;而idea的般本太低&#xff0c;导致识别的时候稳定性差 解决 使用idea原生的maven版本 选择已捆绑的m…

win10 ping不通 Docker ip(解决截图)

背景&#xff1a; win10下载了docker desktop就是这个图&#xff0c;然后计划做一个springboot连接docker。 docker部署springboot :docker 部署springboot(成功、截图)_總鑽風的博客-CSDN博客 问题&#xff1a;spring boot部署docker后&#xff0c;docker接口通了&#xff0…

Tomcat 日志乱码问题解决

我就是三井&#xff0c;一个永不放弃希望的男人。——《灌篮高手》 Tomcat 日志乱码问题解决 乱码原因&#xff1a;字符编码不一致 如&#xff1a;国内电脑一般都是GBK编码&#xff0c;而Tomcat日志使用的是UTF-8编码 解决方法&#xff1a;将对应字符编码由 UTF-8 改为 GBK 即…

【业务功能篇97】微服务-springcloud-springboot-电商购物车模块-获取当前登录用户的购物车信息

购物车功能 一、购物车模块 1.创建cart服务 我们需要先创建一个cart的微服务&#xff0c;然后添加相关的依赖&#xff0c;设置配置&#xff0c;放开注解。 <dependencies><dependency><groupId>com.msb.mall</groupId><artifactId>mall-commo…

串行协议——USB驱动[基础]

多年前的学习记录&#xff0c;整理整理。 一、USB协议基础 二、Linux内核USB驱动源码分析 USB中不同类型设备使用的 设备描述符(设备类\设备子类\设备协议) 配置不同,典型的以下几种:1)HID设备: Human Input Device人工输入设备, 如鼠标\键盘\游戏手柄等.2)CDC设备: Communi…

无涯教程-Flutter - 安装步骤

本章将指导您详细在本地计算机上安装Flutter。 在Windows中安装 在本节中&#xff0c;让无涯教程看看如何在Windows系统中安装 Flutter SDK 及其要求。 第1步 - 转到URL,https: //flutter.dev/docs/get-started/install/windows并下载最新的Flutter SDK。 第2步 - 将zip归档…

第二次作业

1.编写脚本for1.sh,使用for循环创建20账户&#xff0c;账户名前缀由用户从键盘输入&#xff0c;账户初始密码由用户输入&#xff0c;例如: test1、test2、test3、.....、 test10 编写脚本for1.sh 执行脚本&#xff1a;bash for.sh 2&#xff0c;编写脚本for2.sh,使用for循环,通…

Unity资源无法下载 反复提示需同意Terms of Service和EULA 同意后无效的解决方案

前言 最近在玩Unity&#xff0c;跟着tutorial做点项目&#xff0c;但是在下载免费资源时&#xff0c;只有从网站上点“打开Unity”&#xff0c;才能在本地Unity Editor的Package Manager里找到这个资源&#xff08;且点一下下面的刷新就没有了&#xff09;&#xff0c;并且点击…