首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    一次面试的经历,​设计一个加法,满足100位的数字相加?

    题目 面试官:设计一个加法,满足100位的数字相加? 我:好的。(内心在想"有病吧!这面试官,问些没用的问题!怎么办,不会啊!") 面试官:20分钟哦,你先想,我倒杯水去。...第二步计算: A: 9 1 2 6 7 8 5 6 7 8 0 + B: 3 2 4 2 8 8 8 0 0 0 0 = C: 2 1 0 0 0 0 0 0 0 0 0 9+3=12,2写在结果的第一个篮子中.......一次次轮回计算直到结束: A: 9 1 2 6 7 8 5 6 7 8 0 + B: 3 2 4 2 8 8 8 0 0 0 0 = C: 2 4 6 8 5 7 4 7 7 8 0 得到结果...String转为char数组 //bigNumA, bigNumB 翻转两个字符串后,个位十位相加比较方便 char[] bigNumAChars = new StringBuffer(...for (int i = 0; i < resultLength; i++) { // 如果当前的i超过了某个数组的长度,就用0代替高位了,和另一个字符数组中的数字相加

    32230

    数学十大速算技巧

    二、巧妙运用“首同末合十”   利用“首同末合十”的方法来训练。“首同末合十”法是两个两位数,它们的十位数相同,而个位数相加的和是10。...利用“首同末合十”的两个两位数相乘,积的右边的两位数正好是个位数的乘积,积的左面的数正好是十位上的数乘以比它大1的积,合并起来就是它们的乘积。例如,54×56=3024,81×89=7209。   ...1.任意两位数乘上99的巧算方法是,将这个任意的两位数减去1,作为积的左面的两位数字,再将100减去这个任意两位数的差作为积的右边两位数,合并起来就是它们的积。...2.任意三位数乘上999的巧算方法,就是将这个任意的三位数减去1,作为积的左面的三位数字,再将1000减去这个任意三位数的差作为积的右边的三位数字,合并起来就是它们的积。...七、用“添零加半”的方法巧算   一个数乘上15的速算方法叫做“添零加半”。比如,26×15将26后面添0得260,再加上260的一半130,即260+130=390,所以26×15=360。

    2.1K20

    leetcode刷题(68)——43. 字符串相乘

    你看这个简单过程,其中涉及乘法进位,涉及错位相加,还涉及加法进位;而且还有一些不易察觉的问题,比如说两位数乘以两位数,结果可能是四位数,也可能是三位数,你怎么想出一个标准化的处理方式?...这就是算法的魅力,如果没有计算机思维,简单的问题可能都没办法自动化处理。...首先,我们这种手算方式还是太「高级」了,我们要再「低级」一点,123 × 5 和 123 × 4 的过程还可以进一步分解,最后再相加: 现在 123 并不大,如果是个很大的数字的话,是无法直接计算乘积的...我们可以用一个数组在底下接收相加结果: ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200508113621127.png?...i,j 在 num1 和 num2 上游走,计算乘积,同时将乘积叠加到 res 的正确位置: 现在还有一个关键问题,如何将乘积叠加到 res 的正确位置,或者说,如何通过 i,j 计算 res 的对应索引呢

    31720

    输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字

    题目: 输入一个已经按升序排序过的数组和一个数字, 在数组中查找两个数,使得它们的和正好是输入的那个数字。 要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。...思路: 1 第一种思路,可以把数字存在数组里,比如数组中最大值是15,那么就开一个长度未15的数组1 存在a[1]里 15存在a[15]里;这样用15-a[1]判断里面是否有值就可以了。...2 因为是求两个数,时间复杂度是O(n),还是排过顺序的数组,那么可以从头和从尾同时找;从尾开始的tail下标大于sum,则tail左移;如果tail和head相加小于sum,则tail右移;指导头尾两个数相加等于求和...;或者tail大于head为止; 代码如下: ''' 题目:输入一个已经按升序排序过的数组和一个数字, 在数组中查找两个数,使得它们的和正好是输入的那个数字。...如果有多对数字的和等于输入的数字,输出任意一对即可。 例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。

    2.2K10

    【Java题解】以二进制加法的方式来计算两个内容为二进制数字的字符串相加的结果

    考虑了向前进位的问题,还要考虑当前位的数字相加是否要多加一个来自上一位进的1(即当前位的上一位如果进1了的话,那么当前位相加是需要加上这个进的 1): 前一位没有进 1 前一位进 1 1和0相加 1+...,即它的上一位的两个数相加进了一位,那么0+1才会向前进一位;它的上一位两个数没有向前进位,那么0+1就不会进位 字符串层面分析 计算数字时我们都会右对齐来计算,但是在代码中我们习惯从左到右来分析解决问题...,因此我们可以将字符串反转,计算完后在反转回来就能够得到原来的字符串相加的结果 这里需要用到StringBuilder类和StringBuffer类的reverse()方法来反转字符串,它会修改调用的对象...,而不是新建一个对象: str.reverse();//将字符串str反转 两个字符串的长度如果不相同,我们可以给较短的字符串反转之后再末尾添加上'0'来计算,并且不会影响结果。...strB2.charAt(i):'0'; 这两行代码是来判定是否需要给当前为添加一个0: 注意相加过程的0和1相加的代码,由前面的数字层面分析我们知道,0和1相加是否需要进1取决于它的上一位相加是否进1

    11610

    长整数的乘法运算

    长乘运算 当然, 如果自己实现这样一个大数, 用数组来存储每一位是我当前想到的方法. 那如何进行乘法运算呢?...因为用数组来存储数字, 那么数字的加法也要采用每一位进位的方式来进行, 所以下面为了方便说明算法的效率, 以一次个位数的运算视为一个运算单位....Karatsuba方法 由简入难, 先看一下两位数的乘法: 12*34, 为了方便初中方程未知数的思维, 我们将这两个数字拆解一下: 则, 当化简到这里, 2位数相乘需要几次运算?...算一下: 计算 u: 两位数乘法, 10次运算 计算w: 10次运算 计算s: 两位数减法两次, 一次乘法, 14次运算 计算整体: 8位数相加(), 8次运算 整体: 次运算. 32次运算, 之前长乘的方式需要几次呢..., 则两个算法之间的差距越明显. ---- 有没有被颠覆的感觉?

    1.4K10

    原码、反码、补码的正(nao)确(can)打开方式

    这肯定是不被允许的,所以采用反码的计算机解决办法如下: 反码的符号位相加后,如果有进位出现,则要把它送回到最低位去相加(循环进位)。...比如两个byte类型的数相加,我们用 int 来接收即可。...同理,对于十进制两位数,在将结果百位舍掉的情况下,50可以用60-10得到,或者60+90得到。这里的90也就是100-10得来的,那么我们就说十进制两位数运算系统的模数为100。   ...我们判定:两个相加等于模的数互为补数。   在模表示的范围内做减法运算,可以将“X-Y”的减法变更为“X+Y的补数“的加法,当然这里不考虑结果溢出。   ...很明显,30和-70不是同一个结果,而且也没有产生百位进位。那我们应该怎么办呢?   解决办法很简单,就是让这两个数相等,而且这正好解决了负数的表示方法,-70的绝对值的补数正好是30。

    1.2K101

    LeetCode71场双周赛,新年冲冲冲!

    第一题 给你一个四位 正 整数 num 。请你使用 num 中的 数位 ,将 num 拆成两个新的整数 new1 和 new2 。...比方说,给你 num = 2932 ,你拥有的数位包括:两个 2 ,一个 9 和一个 3 。...解法 虽然题目当中允许我们使用数字自由组合,但很明显由于需要相加之后的和最小,那么显然将其转化成两个两位数相加最合适。...想到将数字组合成两个两位数相加之后,我们进一步可以想到,要使和最小要尽量让这两个两位数也尽量小。这里我们可以用贪心的思想,将小的数作为十位,大的数作为百位。...我们可以将删除n个元素均分数组的操作转换成将长度为3n的数组,拆分成n+k和2n-k两个部分,其中 ,然后在左侧部分删除k个元素,在右侧部分删除n-k个元素。

    57920

    追踪状态——消息解码问题的思路剖析

    让我们考虑最简单的可能性:两位数。这看上去非常简单。在两位数中,第一个数字是十位数,因此我们应该把这个数字乘以10,然后与第二个数字所表示的值相加。...这段代码达到了输出了我们输入的相同的两位数。但是,这个程序使用两个不同的变量保存两个字符输入,虽然它在当前不会有什么问题,但显然不适合作为一种通用的解决方案。...但是当我们需要fourDigitNumber时,就没办法再得到它了。使用threeDigitNumber的值,是否还有办法确定fourDigitNumber的值呢?...我想现在这个模式已经非常清晰了:如果下一个字符非行末符,就可以将当前的数乘以10,然后与当前字符所表示的整数值相加。...接着,我们需要把处理一个数的循环放在一个更大的循环中,后者在所有的数被读取之前将一直持续。

    76330

    数学速算法

    2 1,333 views A+ 所属分类:学习 A、乘法速算 [B]一、十位数是1的两位数相乘[/B] 乘数的个位与被乘数相加,得数为前积,乘数的个位与被乘数的个位相乘,得数为后积,满十前一...数字“0”在不熟练的时候作为助记符,熟练后就可以不使用了。...[/b] 两首位相乘,积加上一个尾数,得数作为前积,两尾数相乘(即尾数的平方),得数作为后积,没有十位补0。...例:35 × 35 (3 + 1)× 3 = 12-- 25 ---------------------- 1225 四、21~50 的两位数的平方 在这个范围内有四个数字是个关键,在求25...例如10减去9等于1,因此9的补数是1,反过来,1的补数是9。 补数的应用:在速算方法中将很常用到补数。例如求两个接近100的数的乘法或除数,将看起来复杂的减法运算转为简单的加法运算等等。

    68620

    二进制与十进制的转换教案「建议收藏」

    我认为这是2 同学们回想一下,我们最早学习的数学运算是什么? 生:加减乘除 师:对,我们最开始学习的就是十以内的加法,之后是两位数的加法,在两位数加法的学习中,老师是不是经常会说,要注意逢十进一?...我们平时用的最多的就是十进制了 那么,大家再想一下,还有没有其他的进制呢?比如:小时、分钟、秒之间是怎么换算的?...第一个1表示1000,第二个1表示100,…… 那么,这个“若干次”是多少呢?有没有什么规定呢?大家观察一下这个例子,以小数点为界,整数部分自右向左,依次是基数的0次、1次、2次、3次幂。...小数部分,自左向右,分别是基数的-1次、-2次、-3次幂。 大家再看一下:2856.42这个十进制数,它的值是怎么算出来的呢? 这就叫做按权相加法。也就是让每一位上的数字字符乘以它所代表的权。...这种将数由一种数制转换成另一种数制称为数制间的转换。

    1.2K100

    2023-10-11:用go语言,一个数字n,一定要分成k份, 得到的乘积尽量大是多少? 数字n和k,可能非常大,到达10^12

    2023-10-11:用go语言,一个数字n,一定要分成k份, 得到的乘积尽量大是多少? 数字n和k,可能非常大,到达10^12规模。 结果可能更大,所以返回结果对1000000007取模。...4.使用循环从1到rest(即剩余数字n)遍历cur,cur为当前需要划分的数字。 5.将cur与process1(rest-cur, j-1)相乘,得到当前划分下的乘积curAns。...算法2:贪心的解 1.首先判断k是否为0或者n是否小于k,若是则返回-1。 2.计算每份应得数字a,为n除以k的商。 3.计算有多少份应该升级成a+1,并将结果保存到变量b中。...5.使用循环从0到b遍历i,将a+1乘以ans,更新ans的值。 6.使用循环从0到k-b遍历i,将a乘以ans,更新ans的值。 7.返回ans作为结果。...算法3:贪心的解(最优解) 1.首先判断k是否为0或者n是否小于k,若是则返回-1。 2.初始化变量mod为1000000007。 3.计算每份应得数字a,为n除以k的商。

    19540

    LeetCode每日一练(两数之和)

    题目如下: 给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。...题目很好理解,就是给你两个链表,比如243和564,需要逆序得到链表所代表的的数值,分别是342和465,将这两个数相加,得到结果807,再逆序存回一个链表并返回。...只击败了18.79%的用户,我们来分析一下导致执行用时过长的原因,首先是对链表的遍历,我们一共遍历了两次链表,然后是链表的创建,这些都是非常耗时的操作,有没有办法能够只进行一次遍历就完成题目的要求呢?...题目表示链表的数字是按逆序方式存储的,这刚好给了我们一个便利的处理方式,我们可以同时遍历两个链表,并分别取出两个链表同一位置上的两个数值,相加后直接放到新创建的链表中,比如243和564链表: 由于数值是逆序存储...,所以链表的第一个元素其实是数值的最后一个数,将2和5相加得到7,故结果的最后一位数为7,再将其存入新的链表,作为第一个结点即可: 然后l1和l2后移一位: 该位置上的两个数相加结果为10

    21520

    LeetCode笔记:400. Nth Digit

    两位数对应的数字有902个,三位数有9003个,所以可以通过这个规律先判断要找的序列数字是几位数。...具体是10还是11,要看有没有余数,这里(12-9)%2=1,所以余数为1,也就是超过了10,是10的后一个数字的第一个数。...其实这里很简单我们直接就可以知道是11中的第一个1。 如果余数是0,说明就是当前找到的数字的最后一位,直接将该数字对10取余即可得到需要的个位数字。...要得到一个多位数中的某位数,有多种做法,一种是化为字符数组直接取,另一种我用的是先取余再做除法,比如要得到1245这个数字中的第三个数字4,先让其对100取余数得到45,然后对10做触发得到4。...另外Math.pow()这个次方计算操作的两个参数必须是double型的,因此也不得不进行了强制转换又转换。

    74920

    两数相加

    给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。...先将l1和l2头节点的值加起来赋值给新链表的头节点 遍历两个链表,只要有一个链表还没有遍历到末尾,就继续遍历 2.每次遍历生成一个当前节点cur的下一个节点,其值为两链表对应节点的和再加上当前节点cur...循环结束后,因为首位可能产生进位,因此如果cur.val是两位数的话,新增一个节点 返回头节点 #include using namespace std; struct ListNode...p2->next : new ListNode(); //生成head链表新的一个节点,用来存放当前遍历得到的l1+l2的val值 //例如第一次循环获得的是l1和l2的十位上数字相加之和...//这里还要加上cur指向当前节点的val值/10,是因为 //例如:第一个两个整数个位相加得到的val=12,那么此时要进位,这里是尾插法,cur的next新节点存放的值是十位的值,因此12

    74910
    领券