发散思维

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

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

  • 找工作被面试官虐,你不能用这个,不能用哪个,还得给我答案

  • 最近碰到了这种奇葩的题目:

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

  • 这种问题一看就不按常理出牌,不能用常规思路去应对,要不然会被气死,这也是发散思维的重要吧(我觉得就是脑筋急转弯),也许是为了考察你心态,不能轻言放弃
  • 我们还是来分析一下这个问题吧:
    • 四则运算不能用,那还能用啥,能想到的只有位运算了吧,总不可能取余,取模运算能搞定加法吧
    • 二进制只有 与, 或,非,异或,没思路,还是从十进制开始分析吧
    • 例如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,类似一个递归的操作来求解。

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

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

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

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

  1. 这个需求很简单,明天上线没问题吧?要不要怼回去?

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 不知道你是否遇到过这样的场景:业务突然说要赶制个活动,先 ...

  2. 【算法】详解二分查找算法(思路很简单,细节是魔鬼)

    我周围的人几乎都认为二分查找很简单,但事实真的如此吗?二分查找真的很简单吗?并不简单.看看 Knuth 大佬(发明 KMP 算法的那位)怎么说的: Although the basic idea of ...

  3. [数据结构与算法] 单链表的简单demo

    Vc6之下编译通过.. 1 /******************************************************* 2 * @: Project: 单链表数据结构演示 3 * ...

  4. 数据结构排序算法——选择排序(简单选择排序)

    简单选择排序(Simple Selection Sort) 一.算法基本思想: 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放 ...

  5. 数据结构与算法--死磕二叉树

    死磕二叉树 近一年都比较关注算法相关的知识,也刷了不少题,之前的文章中大多也是算法相关的文章,但是感觉每次遇到树相关的题型都不能应对自如,因此还是有必要在相关知识上下功夫,因此有此次总结,以下是所有树 ...

  6. 数据结构与算法--我们来玩丢手绢(约瑟夫环问题)

    我们来玩丢手绢 昨天我们打扑克,今天我们丢手绢 丢手绢我们都知道这个游戏,他的由来由约瑟夫 (Josephus)提出来的 据说著名犹太历史学家Josephus有过以下的故事:在罗马人占领乔塔帕特后,3 ...

  7. python数据结构与算法之问题求解

    懂得计算机的童鞋应该都知道,一条计算机程序由数据结构跟算法两大部分组成.所以,其实不管你使用哪种计算机语言编写程序,最终这两部分才是一个程序设计的核心.所以,一个不懂得数据结构与算法的程序员不是一个好 ...

  8. 明翰数据结构与算法笔记V0.8(持续更新)

    文章目录 前言 数据结构 `线性表` `数组` `链表` `栈与队列` [串/字符串] 树 并查集 `二叉树` [二叉排序树/二叉搜索树] `红黑树` 红黑树操作 霍夫曼树 `堆` [大/小]根堆 可 ...

  9. Go语言-数据结构与算法

    go语言之专业数据结构与算法 3.golang实现数组结构 code\ArrayList\ArrayList.go package ArrayListimport ("errors" ...

最新文章

  1. 为了读懂你,AI究竟有多努力?
  2. JS基础 -- 枚举对象中的属性
  3. html网页访问WebAPI中的方法遇到的问题
  4. 排序算法:归并排序、快速排序
  5. 跨主机使用 Rex-Ray volume - 每天5分钟玩转 Docker 容器技术(77)
  6. php轻博客社区视频教程,轻博客主题 - SEO极致优化的ZBLOG轻博客主题
  7. 自然语言10_分类与标注
  8. vs创建的c#winform项目出现缺少根文件,无法读取项目文件*.csproj?
  9. DeepStream输出插件Gst-nvmsgconv和Gst-nvmsgbroker
  10. kido机器人没反应_QQ机器人常见故障排除方法
  11. 网络安全技能大赛D模块常规漏洞加固详解
  12. Synchronized原理(轻量级锁篇)
  13. 最新的 iOS 申请证书与发布流程 2016
  14. 零基础能学大数据吗 需要知道什么核心知识
  15. [组合数学] 容斥原理polya定理
  16. 遍历HashMap的几种方法
  17. java event sourcing_使用Spring Cloud和Reactor在微服务中实现EventSourcing -解道Jdon
  18. C语言学习-Day4
  19. 喂,你是在学习还是在逃避?
  20. Ubuntu 22.04 使用GoldenDict实现整段翻译

热门文章

  1. 剑指offer之中判断二叉树是不是对称二叉树(递归和非递归实现)
  2. C语言之如何输出uint32_t和uint64_t和16进制
  3. LeetCode之Remove Element
  4. Android之如何解决Android studio运行出现的HAX kernel modules is not installed
  5. 网页版消消乐快速实现,无代码吗iVX 真那么简单?
  6. php 字符串打散为数组,用逗号分隔出数组
  7. python beautifulsoup4 table tr_python BeautifulSoup解析表
  8. knex 单表查询_knex.js
  9. 为什么要在沙河中设置小堤坝?
  10. 机械史上最复杂的巅峰之作,这才是最强大脑!