数据结构与算法--这个需求很简单怎么实现我不管(发散思维)

发散思维

  • 程序员是一个高危职业,最近动不动就听到谁谁谁猝死,谁谁谁过劳晕倒,所以面对奇葩问题,我们要淡定,

  • 开发中被产品虐,说的最多的一句话就是这个需求很简单,怎么实现我不管在这里插入图片描述

  • 找工作被面试官虐,你不能用这个,不能用哪个,还得给我答案在这里插入图片描述

  • 最近碰到了这种奇葩的题目:
    在这里插入图片描述

  • 第一眼看这种问题,心里一万头草泥马鹏腾而过,陷入沉默中,我表示很慌

在这里插入图片描述

  • 这种问题一看就不按常理出牌,不能用常规思路去应对,要不然会被气死,这也是发散思维的重要吧(我觉得就是脑筋急转弯),也许是为了考察你心态,不能轻言放弃
  • 我们还是来分析一下这个问题吧:
    • 四则运算不能用,那还能用啥,能想到的只有位运算了吧,总不可能取余,取模运算能搞定加法吧
    • 二进制只有 与, 或,非,异或,没思路,还是从十进制开始分析吧
    • 例如24 + 19 =43,加法,各个位数相加,得到对应的位数的值,有进位则将进位添加到高位去
    • 总的来说就两步:
      • 第一步做加法 得到 33
      • 第二步做进位9+4 有进位 10, 所以33 + 10 = 43
    • 同理是否可以运用到二进制中呢,我们用二进制也做如下分析:

在这里插入图片描述

  • 如上图,如果我们用这种方式 标识:
    • 24 : 0001 1000 , 19: 0001 0011, 相加后得到 0010 1011 与结果相符,因为二进制中并没有这么相加的
    • 但是二模拟加法的话并没有一个操作符完成,那么还按以上步骤进行:
      • 先做加法,在做进位,加法怎么实现, 二进制中 0+1 = 1 ,1+0 =1 ,0+0=0, 1+1 =0, 和异或居然是一样的,那么我们可以通过 num1 ^ num2 得到相加的结果

在这里插入图片描述

  • 因为只有都是1 的位数才有进位,并且在高位相加,找到都是1 的位,我们在之前的位运算文中提到过,用与操作,剩下的就都是1 的位数 1 ^ 1 = 1, 在左移就将1 移动到高位,num1 & num2 << 1
    在这里插入图片描述

  • 那么我们只要将这两个在相加 (num1 ^ num2) + (num1 & num2 << 1),就得到最终结果

  • 那么加法又回到了第一个步骤

  • 经过如上分析,很显然是一个递归或者循环 位运算的问题,那么就能通过位运算得到 加法的解法了
    在这里插入图片描述

  • 遇到这种问题还是要稳住,不要慌,那么我们有如下实现:

/*** @author liaojiamin* @Date:Created in 16:39 2021/7/8*/
public class SummationForBit {public static void main(String[] args) {System.out.println(sumForBit(12,13));}/*** 利用位运算做加法** */public static int sumForBit(int num1, int num2){int sum = 0;int curry = 0;do{sum = num1 ^ num2;curry = (num1 & num2)<<1;num1 = sum;num2 = curry;}while (curry != 0);return sum;}
}

发散思维二

  • 求1+2+3+…+n要求不能用乘法,除法,for,while,if,else,switch,case,以及调节判断语句;
    在这里插入图片描述

  • 卧槽不就是不能写所有逻辑还要求解吗,能用的逻辑操作都给你禁了还要求和。一般我们求等差数列,一般都是用公式(n+1)*n/2,或者循环,或者递归,但是封死了if, for, while,递归循环都不行了,你递归总得有终止条件吧

  • 这是何等的卧槽,那么还是有办法的,不让用循环,那就只能写n次加法了,还不能用逻辑操作,那么就必须定义实例就执行逻辑,就是构造方法了

  • 通过构造方法执行逻辑,然后构造n次,得到结果

/*** @author liaojiamin* @Date:Created in 14:49 2021/7/8*/
public class Summation {private static int sum;public void setNumber(int result){sum = result;}public Summation(int result, int number){setNumber(result);sum+=number;}public int getNumber(){return sum;}public static void main(String[] args) {int s1 =  new Summation(0,1).getNumber();int s2 =  new Summation(s1,2).getNumber();int s3 =  new Summation(s2,3).getNumber();int s4 =  new Summation(s3,4).getNumber();int s5 =  new Summation(s4,5).getNumber();int s6 =  new Summation(s5,6).getNumber();int s7 =  new Summation(s6,7).getNumber();int s8 =  new Summation(s7,8).getNumber();int s9 =  new Summation(s8,9).getNumber();int s10 =  new Summation(s9,10).getNumber();int s11 =  new Summation(s10,11).getNumber();System.out.println(s7);}
}
  • 这个犯法太蠢了,蠢哭了,上面通过不断定义新对象来调用构造方法来实现累加,下面来一个递归的恶心写法
/*** @author liaojiamin* @Date:Created in 15:16 2021/7/8*/
public enum  SummationRecursion {LAST_4(4){@Overridepublic int mySumResult(){return this.getSummation() + LAST_3.mySumResult();}},LAST_3(3){@Overridepublic int mySumResult(){return this.getSummation() + LAST_2.mySumResult();}},LAST_2(2){@Overridepublic int mySumResult(){return this.getSummation() + LAST_1.mySumResult();}},LAST_1(1){@Overridepublic int mySumResult(){return 1;}};private int summation;public int getSummation() {return summation;}public void setSummation(int summation) {this.summation = summation;}SummationRecursion(int summation){this.summation = summation;}public abstract int mySumResult();public static void main(String[] args) {System.out.println(SummationRecursion.LAST_4.mySumResult());}
}
  • 利用枚举中的抽象方法,每个抽象方法都调用下个层级的抽象方法,最终的跳出条件是 LAST_1 的抽象方法直接返回的1,类似一个递归的操作来求解。
    在这里插入图片描述

  • 我看了这种代码都想吐,居然是自己写的。

  • 以上这些问题,都是提醒我们,当被限制的无以复加的时候,感觉啥都不能做了,我们应该发挥脑筋急转弯的创造力,打开新的思路,不要怂就是干,这就是发散思维的精髓。

上一篇:数据结构与算法–我们来玩丢手绢(约瑟夫环问题)
下一篇:数据结构与算法–死磕二叉树

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

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

相关文章

[Java基础]比较器排序Comparator的使用

代码如下: package ComparablePack;public class Student {private String name;private int age;public Student() {}public Student(String name, int age) {this.name name;this.age age;}public String getName() {return name;}public void setName(String name) {this…

手把手教你如何构建 WPF 官方开源框架源代码

本文转自林德熙的博客&#xff08;blog.lindexi.com&#xff09;导语从去年微软就将 WPF 开源了&#xff0c;差不多现在所有 WPF 的源代码都开源了。在学习框架的时候&#xff0c;我会做一些改动&#xff0c;期望能构建一个自己的版本进行测试。但是作为一个特别大的框架&#…

数据结构与算法--再来聊聊数组

再来聊聊数组 这篇我们来总结一下数组相关的一些算法&#xff0c;数组的特点在于我们能通过下标得到对应数据&#xff0c;时间复杂度在O(1)&#xff0c;之前有多篇文章有数组相关的体系&#xff0c;一下来一个归纳&#xff1a; 数据结构与算法–判断扑克牌是否顺子 数据结构…

[Java基础]泛型基础

可变参数的使用&#xff1a; 代码如下: package CanChangePack;import java.util.Arrays; import java.util.List;public class ArgsDemo01 {public static void main(String[] args){List<String> list Arrays.asList("hello","world","jav…

数据结构与算法--二叉树第k个大的节点

二叉树第k个大的节点 二叉树文章列表&#xff1a; 数据结构与算法–面试必问AVL树原理及实现 数据结构与算法–二叉树的深度问题 数据结构与算法–二叉堆&#xff08;最大堆&#xff0c;最小堆&#xff09;实现及原理 数据结构与算法–二叉查找树转顺序排列双向链表 数据…

Istio 中的 Sidecar 注入及透明流量劫持过程详解

图片来源&#xff1a;上海五角场 by Jimmy Song本文基于 Istio 1.5.1 版本&#xff0c;将为大家介绍以下内容&#xff1a;什么是 sidecar 模式和它的优势在哪里。Istio 中是如何做 sidecar 注入的&#xff1f;Sidecar proxy 是如何做透明流量劫持的&#xff1f;流量是如何路由到…

数据结构与算法--求1~n能组成的所有二叉搜索树的排列

给定一个整数n&#xff0c;生成并返回所有N个节点组成并且节点值从1到n互不相同的不同二叉树&#xff0c;可以按照任意顺序 二叉树文章列表&#xff1a; 数据结构与算法–面试必问AVL树原理及实现 数据结构与算法–二叉树的深度问题 数据结构与算法–二叉堆&#xff08;最大…

Java语法基础50题训练(下)

题目1: HashMap集合存储学生对象并遍历。 需求: 创建一个HashMap集合&#xff0c;键是学生对象(Student)&#xff0c;值是居住地(String)。存储多个键值对象&#xff0c;并遍历。 要求: 保证键的唯一性&#xff1a;如果学生对象的成员变量值相同&#xff0c;我们就认为是同一…

用long类型让我出了次生产事故,写代码还是要小心点

昨天发现线上试跑期的一个程序挂了&#xff0c;平时都跑的好好的&#xff0c;查了下日志是因为昨天运营跑了一家美妆top级淘品牌店&#xff0c;会员量近千万&#xff0c;一下子就把128G的内存给爆了&#xff0c;当时并行跑了二个任务&#xff0c;没辙先速写一段代码限流&#x…

Mongodb查询分析器解析

Mongodb查询分析器 动态相关项目中涉及到数据量大和吞吐量的接口&#xff0c;例如关注页面动态&#xff0c;附近动态&#xff0c;这部分数据都是存储在mongodb中&#xff0c;在线上数据中分类两个mongodb集合存储其中关注动态基于扩散写的设计&#xff0c;数据量已经快到 8 亿…

[Java基础]Collections概述和使用

代码如下: package CollectionDemo01;import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List;public class CollectionDemo01 {public static void main(String[] args){List<Integer> list new ArrayList&l…

链路追踪在ERP系统中的应用实践

源宝导读&#xff1a;随着ERP的部署架构越来越复杂&#xff0c;对运维监控、问题排查等工作增加了难度&#xff0c;本文将介绍通过引入链路追踪技术&#xff0c;提高ERP系统问题排查效率&#xff0c;支撑更全面监控系统运行情况的实践过程。一、导读随着ERP的部署架构越来越复杂…

[Java基础]File基础

File类概述和构造方法: 代码如下: package FileStudyPack;import java.io.File;public class FileDemo01 {public static void main(String[] args){File f1 new File("D:\\JavaDemo\\java.txt");System.out.println(f1);File f2 new File("D:\\JavaDemo&quo…

java 日志乱码_【开发者成长】JAVA 线上故障排查完整套路!

云栖号资讯&#xff1a;【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯&#xff0c;还在等什么&#xff0c;快来&#xff01;线上故障主要会包括 CPU、磁盘、内存以及网络问题&#xff0c;而大多数故障可能会包含不止一个层面的问题&#xff0c;所以进行…

谈谈登录密码传输这件小事

背景 大大小小的系统其实都离不开登录这个小小的功能&#xff0c;前段时间老黄在审查公司部分系统代码时&#xff0c;发现不少系统的登录还是很粗暴的&#xff0c;粗暴到让人不敢说话的那种。说到登录&#xff0c;结合标题&#xff0c;其实大部分人应该都猜到那个粗暴到让人不敢…

技术分享杂七杂八技术

技术分享 听花谷 距离名宿 6~7 公里左右&#xff0c;丽江网红基地&#xff0c;有举办婚礼的地方听花谷&#xff0c;坐落于玉龙雪山脚下&#xff0c;前有玉龙雪山&#xff0c;后有原始森林。园内共有三处白色空间&#xff0c;第一处共有三层&#xff0c;婚礼举行&#xff0c;发…

java 操作日志设计_日志系统新贵 Loki,确实比笨重的ELK轻

本文同步Java知音社区&#xff0c;专注于Java作者&#xff1a;linkt1234http://blog.csdn.net/Linkthaha/article/details/100575278最近&#xff0c;在对公司容器云的日志方案进行设计的时候&#xff0c;发现主流的ELK或者EFK比较重&#xff0c;再加上现阶段对于ES复杂的搜索功…

Istio1.5 Envoy 数据面 WASM 实践

Istio 1.5 回归单体架构&#xff0c;并抛却原有的 out-of-process 的数据面扩展方式&#xff0c;转而拥抱基于 WASM 的 in-proxy 扩展&#xff0c;以期获得更好的性能。本文基于网易杭州研究院轻舟云原生团队的调研与探索&#xff0c;介绍 WASM 的社区发展与实践。超简单版解释…