-
求栈中元素个数算法_精妙的算法——计算二进制中1的个数
2020-12-04 09:20:50如何计算二进制中1的个数?全部遍历一遍?不……不……这不是最优解……下面看一段代码:int bitcount (unsigned int n) { int count=0 ; while (n) { count++ ; n &= (n - 1) ; } return count ; }太巧啦...如何计算二进制中1的个数?
全部遍历一遍?
不……不……这不是最优解……
下面看一段代码:
int bitcount (unsigned int n) { int count=0 ; while (n) { count++ ; n &= (n - 1) ; } return count ; }
太巧啦~
刚看到这个代码的时候,觉得这个解法真是太巧啦、太精妙啦(不要怪我没见过世面 )~
下面我们来理解一下这个代码,这个代码中核心的代码只有一行,就是 n &= (n - 1) ,我们分开看一下:
- n-1:一个二进制的数减1,就是将这个二进制最右边的那个1变成0,然后它后边的所有位置都变成1~ 举例:0011 0100,减1(n-1)后变成:0011 0011。
- n &= (n-1),并操作就会将有0的位置都变成0,上面的例子的结果就是0011 0000,然后再赋值给n,这时n就去掉了一个1,或者叫做计数了一个1。以此类推,就可以得到1的个数。
0011 0100 - 1 = 0011 0011 0011 0100 & 0011 0011 = 0011 0000 // 计数一个1 0011 0000 - 1 = 0010 1111 0011 0000 & 0010 1111 = 0010 0000 // 计数两个1 0010 0000 - 1 = 0001 1111 0010 0000 & 0001 1111 = 0000 0000 // 计数三个1,程序停止
这样只需要循环3次,而如果直接遍历就会循环6次,性能明显提高啦~
给个极端的例子 1000 0000,这个直接遍历得遍历8次,而通过上面的代码只需要遍历
1次~1次~~1次~~~
真是太精妙啦~
大家还有更优解吗?还有类似的这种精妙的算法吗?有那种让你眼前一亮的简短代码吗?欢迎留言啦~~~
-
求栈中元素个数算法_嵌入式必知基础算法(一)
2020-12-03 13:28:22算法的描述:是对要解决一个问题或要完成一项任务所采取的方法和步骤的描述,包括需要什么数据(输入什么数据、输出什么结果)、采用什么结构、使用什么语句以及如何安排这些语句等。通常使用自然语言、结构化流程图、...算法(Algorithm):计算机解题的基本思想方法和步骤。
算法的描述:是对要解决一个问题或要完成一项任务所采取的方法和步骤的描述,包括需要什么数据(输入什么数据、输出什么结果)、采用什么结构、使用什么语句以及如何安排这些语句等。通常使用自然语言、结构化流程图、伪代码等来描述算法。
一、计数、求和、求阶乘等简单算法
此类问题都要使用循环,要注意根据问题确定循环变量的初值、终值或结束条件,更要注意用来表示计数、和、阶乘的变量的初值。
例:用随机函数产生100个[0,99]范围内的随机整数,统计个位上的数字分别为1,2,3,4,5,6,7,8,9,0的数的个数并打印出来。
本题使用数组来处理,用数组a[100]存放产生的100个随机整数,数组x[10]来存放个位上的数字分别为1,2,3,4,5,6,7,8,9,0的数的个数。即个位是1的个数存放在x[1]中,个位是2的个数存放在x[2]中,……个位是0的个数存放在数组x[10]。
二、求两个整数的最大公约数、最小公倍数
分析:求最大公约数的算法思想:(最小公倍数=两个整数之积/最大公约数)
(1) 对于已知两数m,n,使得m>n;
(2) m除以n得余数r;
(3) 若r=0,则n为求得的最大公约数,算法结束;否则执行(4);
(4) m←n,n←r,再重复执行(2)。
例如: 求 m="14" ,n=6 的最大公约数.
m n r
14 6 2
6 2 0
三、判断素数
只能被1或本身整除的数称为素数基本思想:把m作为被除数,将2至sqrt(m)作为除数,如果都除不尽,m就是素数,否则就不是。
将其写成一函数,若为素数返回1,不是则返回0
四、验证哥德巴赫猜想
(任意一个大于等于6的偶数都可以分解为两个素数之和)
基本思想:n为大于等于6的任一偶数,可分解为n1和n2两个数,分别检查n1和n2是否为素数,如都是,则为一组解。如n1不是素数,就不必再检查n2是否素数。先从n1=2开始,检验n1和n2(n2=N-n1)是否素数。然后使n1+2 再检验n1、n2是否素数,… 直到n1=n/2为止。
利用上面的prime函数,验证哥德巴赫猜想的程序代码如下:
五、排序问题
1.选择法排序(升序)
基本思想:
1)对有n个数的序列(存放在数组a(n)中),从中选出最小的数,与第1个数交换位置;
2)除第1 个数外,其余n-1个数中选最小的数,与第2个数交换位置;
3)依次类推,选择了n-1次后,这个数列已按升序排列。
程序代码如下:
2.冒泡法排序(升序)
(将相邻两个数比较,小的调到前头)基本思想:
1)有n个数(存放在数组a(n)中),第一趟将每相邻两个数比较,小的调到前头,经n-1次两两相邻比较后,最大的数已“沉底”,放在最后一个位置,小数上升“浮起”;2)第二趟对余下的n-1个数(最大的数已“沉底”)按上法比较,经n-2次两两相邻比较后得次大的数;
3)依次类推,n个数共进行n-1趟比较,在第j趟中要进行n-j次两两比较。
程序段如下
3.合并法排序(升序)
(将两个有序数组A、B合并成另一个有序的数组C。)
基本思想:
1)先在A、B数组中各取第一个元素进行比较,将小的元素放入C数组;
2)取小的元素所在数组的下一个元素与另一数组中上次比较后较大的元素比较,重复上述比较过程,直到某个数组被先排完;
3)将另一个数组剩余元素抄入C数组,合并排序完成。
程序段如下:
六、查找问题
顺序查找法
基本思想:一列数放在数组a[1]---a[n]中,待查找的数放在x 中,把x与a数组中的元素从头到尾一一进行比较查找。用变量p表示a数组元素下标,p初值为0,使x与a[p]比较,如果x不等于a[p],则使p=p+1,不断重复这个过程;一旦x等于a[p]则退出循环;另外,如果p大于数组长度,循环也应该停止。(这个过程可由下语句实现)
思考:将上面程序改写一查找函数Find,若找到则返回下标值,找不到返回-1
②基本思想:一列数放在数组a[1]---a[n]中,待查找的关键值为key,把key与a数组中的元素从头到尾一一进行比较查找,若相同,查找成功,若找不到,则查找失败。查找过程如下,index:存放找到元素的下标。)
今天的分享到这里就结束了,今天的内容是否对您有帮助呢,如果觉得我们的文章对您有帮助,劳烦您动动您的手指分享转发下我们的文章吧~
关注睿感电子科技订阅号~
带您玩转硬件,不迷路~
“ 写文章不易,给作者打个赏买个六味地黄丸补补 ”
-
栈应用之中缀转后缀表达式计算(C++、JAVA)
2017-01-29 19:02:49在栈应用之中缀转后缀表达式(C语言版) 这篇文章中已经讲了如何把中缀表达式转化为后缀表达式,这一篇就讲如何计算后缀表达式,计算比转换容易得多得多了。C++代码实现下载 java代码实现下载 (备用下载地址 )步骤...==> 学习汇总(持续更新)
==> 从零搭建后端基础设施系列(一)-- 背景介绍在栈应用之中缀转后缀表达式(C语言版) 这篇文章中已经讲了如何把中缀表达式转化为后缀表达式,这一篇就讲如何计算后缀表达式,计算比转换容易得多得多了。
C++代码实现下载
java代码实现下载
(备用下载地址 )步骤如下:
1.扫描到数字则入栈
2.扫描到运算符则将栈顶的两个元素依次出栈做相应的运算,把结果再入栈如图:
1、
2、
3、
4、
5、
6、
7、
8、
栈应用之中缀转后缀表达式(C语言版)
约瑟夫问题详解+源码
线性表之循环队列
线性表之链队列
线性表之顺序队列
线性表之链栈
线性表之顺序栈
线性表之双向链表
线性表之循环链表
线性表之单链表
线性表之顺序表 -
如何结束栈的初始化过程(C语言)
2019-06-01 22:59:36主要的问题在于初始化,如果栈中元素是int类型的,初始化的时候用户通过scanf函数输入整型,需要设置一个停止的标识。很多例程中采用数字0或者其他数字作为停止符,这样的问题就是0永远都没有机会出现在栈中。那么...本文为原创,若有错误欢迎批评指正!
最近在尝试着把栈的一些应用,例如进制转换、括号匹配、逆波兰计算取、中后缀转换等写成一个大的demo,于是被数据类型的问题搞得略纠结。
主要的问题在于初始化,如果栈中元素是int类型的,初始化的时候用户通过scanf函数输入整型,需要设置一个停止的标识。很多例程中采用数字0或者其他数字作为停止符,这样的问题就是0永远都没有机会出现在栈中。那么问题就来了,怎么设定一个可以检测的标志,结束栈的输入初始化呢?
一. 选取一个永远不可能入栈的按键
最容易想到的就是ESC键。对应的ASCII码为27,注意此时不能使用标准IO,要用控制台IO。
#include <windows.h> #include <conio.h> while(1) { c = _getch(); if(c==27) break; else { e = (int)(c-'0'); Push(S,e);//入栈 } }
缺点:只能输入个位数,而且[](){}之类的都存储为ASCII码值。 -
JAVA 使用栈实现后缀表达式的计算
2020-09-01 20:01:593、如果遇到操作符,则从栈中弹出两个操作数,计算结果,然后把结果入栈。 4、遍历完后缀表达式,则计算完成,此时的栈顶元素即为计算结果。 例如:后缀表达式"3 4 + 5 × 6 - " (1) 初始化栈,栈顶指针为空,从... -
python 链式计算框架_计算机二级MS Office选择题基础讲解(共五篇)第一篇 栈与队列...
2020-12-15 19:05:05现经过一系列正常的入栈与退栈操作后,top=20,则栈中的元素个数为( )A.31 B.30 C.21 D.202.队列图示2.2队列的基本操作 队列的基本操作包括入队和出队,再进行入队和出队的操作时应注意队列是“先进后出”的线性表... -
数据结构之中缀表达式计算
2020-08-06 17:53:00我们在计算机器中输入“7*2*2-5+1-5+3-4”,就能很快得到结果18,那么如何利用栈结构模拟实现计算机呢?下面就来聊聊在编写代码时的思路,注意点以及代码(我只考虑了简单的加减乘除运算,其中包含多位数的计算)。 ... -
算法与数据结构学习(10)-栈(1)
2021-01-06 21:48:15栈的一个实际需求 输入一个表达式: 计算式:722-5+1-5*3-3,计算其结果 请问: 计算机的底层是如何运行得到结果的? **对于计算机而言,得到的...4.根据栈的定义可知,最先放入栈中的元素在栈底,最后放入栈的元素在栈 -
不带括号的表达式计算
2018-11-16 17:40:59假设一中的表达式是一段程序可读的字符串,如何计算表达式的值 三、思路 1.创建两个栈,分别为数字栈、和运算符栈 2.遍历字符串 3.当遇到数字将数字存储到数字栈中 4.当遇到运算符时,比较运算符栈顶元素和当前... -
计算机二级公共基础知识
2011-04-30 14:00:09计算循环队列的元素个数:“尾指针减头指针”,若为负数,再加其容量即可。 1.5 链表 在链式存储方式中,要求每个结点由两部分组成:一部分用于存放数据元素值,称为数据域;另一部分用于存放指针,称为指针域。其中... -
数据结构之中缀表达式转后缀表达式
2020-08-11 11:16:52为了大家都方便,下面就聊聊如何把一个中缀表达式借助代码转化成一个后缀表达式。 在实现转后缀表达式时,用栈结构存储操作符,由于中间结构不用出栈,并且如果用栈结构存储,那么将出栈结果逆序才是我们要的后缀... -
数据结构之二(模拟计算器1)
2020-10-16 10:55:32提示:文章写完后,目录可以自动生成,...2.2 运算符如果字符栈为空,直接进栈,如果不为空,和栈顶元素比较运算优先级,小于等于字符顶元素,则取出数字栈栈顶元素和次栈顶元素进行运算,再将该字符串压入字符栈中, -
后缀表达式实现简单的加减乘除运算
2019-07-31 19:21:40当遇到一个数是就把它推入栈中;在遇到一个运算符时该运算符就作用于从该栈弹出的两个操作数上,再将所得的结果推入栈中。最终,栈中只有一个元素,即为答案。 注:本文是利用后缀表达式实现简单的加减乘除运算,... -
大话数据结构三个版本
2018-09-10 09:39:38而只是让每个元素知道它下一个元素的位置在哪里。 3.6.1顺序存储结构不足的解决 办法 55 3.6.2线性表链式存储结构定义 56 3.6.3头指针与头结点的异同 58 3.6.4线性表链式存储结构代码描述 58 3.7单链表的读取 60 3.8... -
大话数据结构(中文高清版)
2017-04-19 11:57:092.3 两种算法的比较 19 高斯在上小学的一天,老师要求每个学生都计算1+2+…+100的结果,谁先算出来谁先回家…… 2.4 算法定义 20 现实世界中的算法千变万化,没有通用算法可以解决所有问题。甚至一个小问题,某个... -
可以减少递归深度的办法:某段的元素个数如果<=3,则返回True;某整段的最小元素不小于尾元素或者整段的最大元素不大于尾元素,说明仅有左子树或者右子树,返回True。 面试题25:二叉树中和为某一值的路径:递归 ...
-
Java开发技术大全(500个源代码).
2012-12-02 19:55:48outputMax.java 求两个数中的最大数 overflowExample.java 演示溢出 precedence.java 演示自加运算符的优先级 primeNumber.java 输出100-200之间的所有素数 ranking.java 评定成绩等级 rankingBySwitch.java ... -
中缀表达式转化成前缀、后缀表达式
2019-07-02 21:50:58利用两个栈S1,S2:其中S1存放操作符,S2存放操作数 从左往右遍历中缀表达式,如果遇到数字,则放入S2中,如果遇到操作符,则放入S1中。在放操作符的时候有一定的规则,如果栈为空或栈顶元素为(,则直接压栈。如果... -
最权威的C++教程_C++_Primer_Plus中文第五版+C++_Primer中文第四版(都含源码+习题)(共4分卷)分卷1
2010-06-23 17:33:55读者将学习如何打开文件,以进行输入和输出,如何在文件中追加数据,如何使用二进制文件,如何获得 对文件的随机访问权。最后,还将学习如何使用标准的I/O方法来读取和写入字符串。 附录A:计数系统 本附录讨论... -
最权威的C++教程_C++_Primer_Plus中文第五版+C++_Primer中文第四版(都含源码+习题)(共4分卷)分卷2
2010-06-23 17:47:19读者将学习如何打开文件,以进行输入和输出,如何在文件中追加数据,如何使用二进制文件,如何获得 对文件的随机访问权。最后,还将学习如何使用标准的I/O方法来读取和写入字符串。 附录A:计数系统 本附录讨论... -
最权威的C++教程_C++_Primer_Plus中文第五版+C++_Primer中文第四版(都含源码+习题)(共4分卷)分卷3
2010-06-23 18:03:39读者将学习如何打开文件,以进行输入和输出,如何在文件中追加数据,如何使用二进制文件,如何获得 对文件的随机访问权。最后,还将学习如何使用标准的I/O方法来读取和写入字符串。 附录A:计数系统 本附录讨论... -
逆波兰(后缀)表达式求值C++实现
2018-04-04 10:01:08之前的一篇文章里已经讲到里怎么将中缀表达式转化为后缀表达式:...3、如果扫描的项目是一个二元运算符+ - * /,则栈顶到两个元素依次出栈,计算后再将结果存入栈中;(接下... -
3.5.3 给40亿个不重复的unsigned int的整数,没排过序的,然后再给几个数,如何快速判断这几个数是否在那40亿个数当中? 3.5.4 在一个文件中有10G个整数,乱序排列,要求找出中位数。内存限制为2G。 3.5.5 时分秒针...
-
【java数据结构与算法学习】中缀表达式转后缀表达式
2018-03-05 19:37:14通常我们的计算方式都是中缀表达式,如何转化为后缀表达式呢?主要的思想就是:我们创建一个操作符栈,当我们遇到数字的时候就直接进行保存或者输出;...最后将栈中的所有操作符全部弹出。先乘除后加减,同级别的先... -
javascript入门笔记
2018-05-15 15:01:07Javascript Basic 1、Javascript 概述(了解) Javascript,简称为 JS,是一款能够运行在 JS解释器/引擎 中的脚本语言 ... 1、定义一个函数 change ,该函数中接收两个参数(a,b) 2、在函数体中,如果 a 大于 b的话... -
数据结构演示软件
2013-06-02 21:32:36该窗口的下方为递归工作栈,栈中的记录含3个数据项,其中 adr 指示调用语句所在行号,n 指示物件个数,t 指示背包总体积。 7. 阿克曼函数 整个演示屏只有显示算法文本和显示算法执行过程中栈的状态两个窗口。在... -
用c描述的数据结构演示软件
2012-07-24 13:31:25该窗口的下方为递归工作栈,栈中的记录含3个数据项,其中 adr 指示调用语句所在行号,n 指示物件个数,t 指示背包总体积。 7. 阿克曼函数 整个演示屏只有显示算法文本和显示算法执行过程中栈的状态两个窗口。在... -
Java常用算法手册(第3版).宋娟(带详细书签).pdf
2018-10-22 23:41:44接着详细讲解了算法在排序、查找、数学计算、数论、历史趣题、游戏等领域中的应用;后梳理和精选了一些经典的算法面试题,供读者开拓思维之用。 第1章 算法和实现算法的Java语法 1.1 建立算法初步概念 1.1.1 什么...
-
元素周期表-three.js实战详解
-
1024 Palindromic Number (25 point(s))
-
2021-02-25
-
SSiCP:一种新的基于SVM的递归特征消除算法,用于多类癌症分类
-
基于python的dango框架购物商城毕业设计毕设源代码使用教程
-
从业务运维转到产品经理,我摸爬滚打的产品之路
-
Linux基础入门系列课程
-
中间边缘队列-源码
-
DHCP 动态主机配置服务(在Linux环境下,配置单网段或跨网段提)
-
剑指offer-10 斐波那契数列
-
Springboot+Mybatis 一对多查询案例
-
去除空白文件夹.bat
-
Data1.cab补充文件
-
elementUI select多选下拉框文本过长时样式问题解决
-
hive入门学习:explain执行计划的理解
-
DOPOD900_HK_130108_130224_11100_CHT_Ship.exe
-
?? javascript es6 Null 判断运算符
-
JMETER 性能测试基础课程
-
480、Java工具和中间件04 -【Redis - Redis Client】 2021.02.25
-
MySQL你该了解的那些事【服务端篇】