不用加减乘除做加法

写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。

两个数异或:相当于每一位相加,而不考虑进位;

两个数相与,并左移一位:相当于求得进位;

将上述两步的结果相加


python没有无符号左移操作,所以需要越界检查,加法是异或,进位是与<<1

https://blog.csdn.net/lrs1353281004/article/details/87192205

  1. def Add(self, num1, num2):
  2. # write code here
  3. while(num2):
  4. num1,num2 = (num1^num2) & 0xFFFFFFFF,((num1&num2)<<1) & 0xFFFFFFFF
  5. return num1 if num1<=0x7FFFFFFF else ~(num1^0xFFFFFFFF)
  6. # 用 ctypes 来定义 c 语言的数据类型
  7. import ctypes
  8. def c_int(v): return ctypes.c_int(v).value
  9. while num2 != 0:
  10. num1, num2 = c_int(num1 ^ num2), c_int((num1 & num2) << 1)
  11. return num1

二进制中1的个数

输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

n与n-1进行按位与,最靠右的1置零,其他的高位的1没有发生变化,每运行一次,就可以知道有一个1


负数在计算机是以补码存在的,最高位为1,而负数往右移,符号位不变,符号位1往右移,最终可能会出现全1的情况,导致死循环,与0xFFFFFFFF相与,可以消除负数的影响

  1. def NumberOf1(self, n):
  2. # write code here
  3. n = 0xFFFFFFFF & n
  4. count = 0
  5. for c in str(bin(n)):
  6. if c == "1":
  7. count += 1
  8. return count
  9. # write code here
  10. count = 0
  11. for i in range(32):
  12. mask = 1 << i
  13. if n & mask != 0:
  14. count += 1
  15. return count
  16. #循环次数最少
  17. count = 0
  18. if n < 0:
  19. n = n & 0xffffffff
  20. while n:
  21. count += 1
  22. n = (n - 1) & n
  23. return count

重建二叉树

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

  1. # -*- coding:utf-8 -*-
  2. class TreeNode:
  3. def __init__(self, x):
  4. self.val = x
  5. self.left = None
  6. self.right = None
  7. class Solution:
  8. # 返回构造的TreeNode根节点
  9. def reConstructBinaryTree(self, pre, tin):
  10. if not pre or not tin:
  11. return None
  12. if len(pre) != len(tin):
  13. return None
  14. # 取出pre的第一个值:根节点
  15. root = pre[0]
  16. rootNode = TreeNode(root)
  17. # 找到在中序遍历中的根节点所在的索引位置
  18. pos = tin.index(root)
  19. # 中序遍历的列表的左右节点分开切片成两个列表
  20. tinLeft = tin[0:pos]
  21. tinRight = tin[pos + 1:]
  22. # 前序遍历的列表的左右节点分开切片成两个列表
  23. preLeft = pre[1:pos + 1]
  24. preRight = pre[pos + 1:]
  25. leftNode = self.reConstructBinaryTree(preLeft, tinLeft)
  26. rightNode = self.reConstructBinaryTree(preRight, tinRight)
  27. rootNode.left = leftNode
  28. rootNode.right = rightNode
  29. return rootNode

字符串的排列

输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。

  1. # -*- coding:utf-8 -*-
  2. class Solution:
  3. def Permutation(self, ss):
  4. if len(ss) <= 1:
  5. return ss
  6. res = set()
  7. # 遍历字符串,固定第一个元素,第一个元素可以取a,b,c...,然后递归求解
  8. for i in range(len(ss)):
  9. for j in self.Permutation(ss[:i] + ss[i+1:]): # 依次固定了元素,其他的全排列(递归求解)
  10. res.add(ss[i] + j) # 集合添加元素的方法add(),集合添加去重(若存在重复字符,排列后会存在相同,如baa,baa)
  11. return sorted(res) # sorted()能对可迭代对象进行排序,结果返回一个新的list

求1+2+3+...+n

求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。

递归+短路原理:逻辑与两侧为真默认输出后边的真值

  1. # -*- coding:utf-8 -*-
  2. class Solution:
  3. def Sum_Solution(self, n):
  4. # write code here
  5. return n and (n + self.Sum_Solution(n - 1))

未完待续...

牛客网剑指offer【Python实现】——part2的更多相关文章

  1. 数组中只出现过一次的数字 牛客网 剑指Offer

    数组中只出现过一次的数字 牛客网 剑指Offer 题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了偶数次.请写程序找出这两个只出现一次的数字. def FindNumsAppearOnce ...

  2. 数组中出现次数超过一半的数字 牛客网 剑指Offer

    数组中出现次数超过一半的数字 牛客网 剑指Offer 题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字 ...

  3. 数据流中的中位数 牛客网 剑指Offer

    数据流中的中位数 牛客网 剑指Offer 题目描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就 ...

  4. 数字在排序数组中出现的次数 牛客网 剑指Offer

    数字在排序数组中出现的次数 牛客网 剑指Offer 题目描述 统计一个数字在排序数组中出现的次数. class Solution: def GetNumberOfK(self, data, k): i ...

  5. 数值的整数次方 牛客网 剑指Offer

    数值的整数次方 牛客网 剑指Offer 题目描述 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方 class Solution: #run ...

  6. 按之字形顺序打印二叉树 牛客网 剑指Offer

    按之字形顺序打印二叉树 牛客网 剑指Offer 题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推 ...

  7. 把数组排成最小的数 牛客网 剑指Offer

    把数组排成最小的数 牛客网 剑指Offer 题目描述 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能 ...

  8. 把字符串转换成整数 牛客网 剑指Offer

    把字符串转换成整数 牛客网 剑指Offer 题目描述 将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0),要求不能使用字符串 ...

  9. 把二叉树打印成多行 牛客网 剑指Offer

    把二叉树打印成多行 牛客网 剑指Offer 题目描述 从上到下按层打印二叉树,同一层结点从左至右输出.每一层输出一行 # class TreeNode: # def __init__(self, x) ...

  10. 栈的压入、弹出顺序 牛客网 剑指Offer

    栈的压入.弹出顺序 牛客网 剑指Offer 题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是 ...

随机推荐

  1. Coding and Paper Letter(十五)

    资源整理. 1.Nature Climate Change论文"Higher temperatures increase suicide rates in the United States ...

  2. Spring Boot 学习1-创建Spring Boot应用

    如果使用Maven, 确保先安装好Maven再继续. 创建POM文件 在这里有两种方式: 继承Spring Boot parent的pom. 不继承. 继承Spring Boot pom 1 2 3 ...

  3. json_encode在设计api时需要注意的问题

    1. 在设计api时我们经常会使用关联数组,例如:我要返回给客户端主题信息和主题包列表 原始数组格式 $arr = array( 100=>array('themeName'=>'a',' ...

  4. linux svn 安装(支持http访问)

    1.安装svn yum install -y subversion 2.查看svn版本 svn --version 3.创建仓库 mkdir -p /opt/java/repos cd /opt/ja ...

  5. JavaScript实现队列结构(Queue)

    JavaScript实现队列结构(Queue) 一.队列简介 队列是是一种受限的线性表,特点为先进先出(FIFO:first in first out). 受限之处在于它只允许在表的前端(front) ...

  6. 使用IDEA创建Maven整合SSM

    创建数据库 CREATE DATABASE `ssmbuild`; USE `ssmbuild`; DROP TABLE IF EXISTS `books`; CREATE TABLE `books` ...

  7. 前端每日实战:85# 视频演示如何用纯 CSS 创作一个小球反弹的动画

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/OwWROO 可交互视频 此视频是可 ...

  8. 三个值得期待的JavaScript新功能!

    让我们来看看JavaScript中一些有用的即将推出的功能.您将看到他们的语法,链接以及时了解他们的进度,我们将编写一个小型测试套件,以展示如何立即开始使用这些提案! JavaScript是如何更新迭 ...

  9. 探索 Redux4.0 版本迭代 论基础谈展望(对比 React context)

    Redux 在几天前(2018.04.18)发布了新版本,6 commits 被合入 master.从诞生起,到如今 4.0 版本,Redux 保持了使用层面的平滑过渡.同时前不久, React 也从 ...

  10. 分布式图数据库 Nebula Graph 的 Index 实践

    导读 索引是数据库系统中不可或缺的一个功能,数据库索引好比是书的目录,能加快数据库的查询速度,其实质是数据库管理系统中一个排序的数据结构.不同的数据库系统有不同的排序结构,目前常见的索引实现类型如 B ...