Leetcode 16.07 最大数值

news2025/1/21 21:20:38

编写一个方法,找出两个数字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.coloradmin.cn/o/966246.html

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

相关文章

Linux常用命令——cupsdisable命令

在线Linux命令查询工具 cupsdisable 停止指定的打印机 补充说明 cupsdisable命令用于停止指定的打印机。 语法 cupsdisable(选项)(参数)选项 -E&#xff1a;当连接到服务器时强制使用加密&#xff1b; -U&#xff1a;指定连接服务器时使用的用户名&#xff1b; -u&#…

【无公网IP内网穿透】异地远程访问本地SQL Server数据库

目录 1.前言 2.本地安装和设置SQL Server 2.1 SQL Server下载 2.2 SQL Server本地连接测试 2.3 Cpolar内网穿透的下载和安装 2.3 Cpolar内网穿透的注册 3.本地网页发布 3.1 Cpolar云端设置 3.2 Cpolar本地设置 4.公网访问测试 5.结语 1.前言 数据库的重要性相信大家…

jdk-8u371-linux-x64.tar.gz jdk-8u371-windows-x64.exe 【jdk-8u371】 全平台下载

jdk-8u371 全平台下载 jdk-8u371-windows-x64.exejdk-8u371-linux-x64.rpmjdk-8u371-linux-x64.tar.gzjdk-8u371-macosx-x64.dmgjdk-8u371-linux-aarch64.tar.gz 下载地址 迅雷云盘 链接&#xff1a;https://pan.xunlei.com/s/VNdLL3FtCnh45nIBHulh_MDjA1?pwdw4s6 百度…

uni-app之android离线打包

一 AndroidStudio创建项目 1.1&#xff0c;上一节演示了uni-app云打包&#xff0c;下面演示怎样androidStudio离线打包。在AndroidStudio里面新建空项目 1.2&#xff0c;下载uni-app离线SDK&#xff0c;离线SDK主要用于App本地离线打包及扩展原生能力&#xff0c;SDK下载链接h…

2023开学礼新疆理工学院图书馆藏八一新书《乡村振兴战略下传统村落文化旅游设计》许少辉新财经理工

2023开学礼新疆理工学院图书馆藏八一新书《乡村振兴战略下传统村落文化旅游设计》许少辉新财经理工

GraalVM Community Edition 22.3.3

https://github.com/graalvm/graalvm-ce-builds/releases/ 按需下载 https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-22.3.3/graalvm-ce-java11-windows-amd64-22.3.3.ziphttps://github.com/graalvm/graalvm-ce-builds/releases/download/vm-22.3.3/nat…

山西电力市场日前价格预测【2023-09-03】

日前价格预测 预测明日&#xff08;2023-09-03&#xff09;山西电力市场全天平均日前电价为316.78元/MWh。其中&#xff0c;最高日前电价为405.32元/MWh&#xff0c;预计出现在19: 15。最低日前电价为249.46元/MWh&#xff0c;预计出现在12: 15。 价差方向预测 1&#xff1a; 实…

公司文件数据防泄密软件——「天锐绿盾透明加密防泄密系统」

天锐绿盾透明加密防泄密系统是一款利用驱动层透明加密技术实现电子文件安全加密的防护产品。该系统集成了密码学、访问控制和审计跟踪等技术手段&#xff0c;对企事业单位电子文件的存储、访问、传播和处理过程进行全方位防护&#xff0c;从源头上保障数据安全和使用安全。 PC访…

springboot web开发登录拦截器

在SpringBoot中我们可以使用HandlerInterceptorAdapter这个适配器来实现自己的拦截器。这样就可以拦截所有的请求并做相应的处理。 应用场景 日志记录&#xff0c;可以记录请求信息的日志&#xff0c;以便进行信息监控、信息统计等。权限检查&#xff1a;如登陆检测&#xff…

.NET之后,再无大创新

回想起来&#xff0c;2001年发布的.NET已经是距离最近的一次软件开发技术的整体创新了&#xff0c;后续的新技术就没有在各个端都这么成功的了。.NET是Windows平台下软件开发技术的巨大变革。在此之前&#xff0c;有VB、C&#xff08;MFC&#xff09;、JSP&#xff0c;在此之后…

cms系统稳定性压力测试出现TPS抖动和毛刺的性能bug【杭州多测师_王sir】

一、并发线程数100&#xff0c;分10个阶梯&#xff0c;60秒加载时间&#xff0c;运行1小时进行压测&#xff0c;到10分钟就出现如下 二、通过jstat -gcutil 16689 1000进行监控

go-zero jwt 鉴权快速实战

前面我们分享了 go-zero 的快速实战以及日志组件的剖析&#xff0c;本次我们来实战使用 go-zero jwt 鉴权 本次文章主要是分享关于 go-zero 中 jwt 的使用方式&#xff0c;会以一个 demo 的方式来进行实战&#xff0c;对于使用 goctl 工具以及安装细节就不在赘述&#xff0c;有…

计算机图形软件(三)6-5 一个完整的OpenGL程序、OpenGL的出错处理

一个完整的OpenGL程序 给出构成一个完整程序的所有部分之前还是有一些任务需要完成。对于显示窗口&#xff0c;我们可以选择背景颜色。我们需要组织一个过程来包含创建显示图形所必需的OpenGL 函数。 要像图3.2 那样使用 RCB 颜色值将显示窗口的背景颜色设定为白色可以使用 Ope…

报错处理:Disk space full

报错环境&#xff1a; Linux 具体报错&#xff1a; No space left on device&#xff0c;磁盘空间已满 排错思路&#xff1a; 当磁盘空间耗尽时&#xff0c;会出现磁盘空间已满的错误。这可能是由于磁盘上的文件过多或者某个文件系统占用了过多磁盘空间。 解决方法&#xff1a;…

Opencv图像暗通道调优

基于雾天退化模型的去雾算法&#xff0c;Opencv图像暗通道调优&#xff0c;&#xff08;清华版代码&#xff09;对普通相片也有较好的调优效果&#xff0c;相片更通透。 结合代码实际运行效果、算法理论模型、实际代码。我个人理解&#xff0c;实际效果是对图像的三个颜色通道…

解决Clipping input data to the valid range for imshow with RGB data([0..1] ...)

解决 Clipping input data to the valid range for imshow with RGB data [0..1] for floats or [0..255] for integers 1. 问题描述2. 解决方法 1. 问题描述 在使用 python 显示 npz 文件中的图片时&#xff0c;使用如下代码&#xff1a; import numpy as np import matplot…

强大的思维导图库SimpleMindMap

本文软件是网友 Frank Yang 推荐的&#xff1b; 什么是 SimpleMindMap &#xff1f; Simple Mind Map 是一个简单、强大的 Web 思维导图库&#xff0c;不依赖任何特定框架&#xff0c;可以帮助你快速开发思维导图产品。同时 Simple Mind Map 也是一个思维导图软件。无论你是开发…

IO面试题整理

1.同步/异步&#xff0c;阻塞/非阻塞是一样的概念吗&#xff1f; 不一样。 阻塞/非阻塞说的是调用者。调用者需要等待就是阻塞&#xff0c;不需要等待就是非阻塞。 同步/异步说的是被调者通知调用者的方式。被调者执行完成后再恢复调用者是同步。被调者立即告诉调用者收到求…

【易售小程序项目】修改“我的”界面前端实现;查看、重新编辑、下架自己发布的商品【后端基于若依管理系统开发】

文章目录 “我的”界面修改效果界面实现界面整体代码 查看已发布商品界面效果商品数据表后端上架、下架商品ControllerMapper 界面整体代码back方法 编辑商品、商品发布、保存草稿后端商品校验方法Controller 页面整体代码 “我的”界面修改 效果 界面实现 界面的实现使用了一…

vue3 Table 分页保留选中状态

//指定id值,数据更新之后保留之前选中的数据 const getRowKeys (row) > {return row.siteId; }; // 这存的是选中的数据 const userSelectionChange (values) > {state.selectedData [...values]; }; // 两个数组对比&#xff0c;判断表格中的数据是否开启选中 cons…