刷题的时候 遇到我不会的题 然后 看了下评论区 答案 我自己半年前的 答案 竟然排在最上面 我自己竟然现在都做不上来了 所以还是 不能放下呀,天天练一下 不然两数之和 都不会 岂不是太丢人了
在学C语言的时候,学过两数交换:《小朋友学C语言(25):两数交换》 https://www.jianshu.com/p/64bc70f0abfe 在学C++的时候,也学了两数交换:《小朋友学C++(14 ):两数交换》 https://www.jianshu.com/p/9a071870e0a0 这里咱们要考虑的是,两个数相等的交换情况。 ********** 2 1 4 3 **********交换相同的值********** 5 5 6 6 0 0 0 0 9 9 结果显示,前两组数值不同的两个数,能交换成功。 后五组相同的值,交换成功的有3组。不成功的有两组,并且值都变成了0。 这是什么原因呢? 观察最后三对的数,都是数组里的同一元素交换。 仔细观察,发现a3 = 5, b3 = 5,这是两个不同的变量(在内存里的地址不同),而myswap2(d[0], d[0]),这是对同一个地址里的数交换。
如果是-0的话,因为0无所谓正负,-0就是0,这会导致计算机里面有两种方式表示0。这是不允许的。那么这个数到底表示多少呢? 事实上,这个数很特殊。 接下来因为减掉之后,数变小了,又变回正常的正数了。 从这里可以看出,int类型的取值范围为[-2147483648, 2147483647], 即[-2^31, 2^31-1] (五)结论 (1)使用(三)中的方法交换两数后,如果数很大的话 ,中间a = (2)如果数很大的话,比如a = 2147483647; b = 1;a = a + b的期望结果是214748364,但是因为这个数不在int的取值范围内,所以得到了一个负数。 所以,建议不要使用(三)中的方法来交换两个数。
之前学C语言的时候,咱们直接在main函数中使用“异或”位运算符,很容易实现了两数交换。 本节课将在此基础上,把交换两个数的算法,封装到swap函数中。 这样不管是哪个地方想要交换两个数,调用swap函数就可以了。 在swap内,m = a = 1, n = b = 2,交换后m = 2, n = 1。但是,m和n的值并不会传回给a和b,导致a和b的值没有被对换。 解决方案,使用上节课讲过的引用。 After Swap: m = 2 n = 1 a = 2 b = 1 分析: 使用引用后,达到了交换a和b的目的。 交换m和n的值,就是交换a和b的值。
2. 两数相加 链接 给出两个非空的链表用来表示两个非负的整数。其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储 一位 数字。 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。 您可以假设除了数字 0 之外,这两个数都不会以 0 开头。 = nil { sum += l2.Val l2 = l2.Next } carry = sum / 10 cur.Next = &ListNode{Val: sum % 10 } cur = cur.Next } return resPre.Next } // 递归实现 func addTwoNumbers2(l1 *ListNode, l2 *ListNode) = nil { add += l2.Val l2 = l2.Next } node := ListNode{ Val: add % 10
题目 思路: 将两个链表看成是相同长度的进行遍历,如果一个链表较短则在前面补 00,比如 987 + 23 = 987 + 023 = 1010 每一位计算的同时需要考虑上一位的进位问题,而当前位计算结束后同样需要更新进位值 如果两个链表全部遍历完毕后,进位值为 11,则在新链表最前方添加节点 11 小技巧:对于链表问题,返回结果为头结点时,通常需要先初始化一个预先指针 pre,该指针的下一个节点指向真正的头结点head。 = null || l2 != null) { int a = l1 == null ? 0 : l1.val; int b = l2 == null ? =null){ l2=l2.next; } } //两个链表都遍历完了之后,如果有进位1,则补一个进位
题目 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标 你可以假设每种输入只会对应一个答案。 但是,数组中同一个元素在答案里不能重复出现 你可以按任意顺序返回答案 示例 1: 输入:nums = [2,7,11,15], target = 9 输出:[0,1] 解释:因为 nums[0] + nums 示例 2: 输入:nums = [3,2,4], target = 6 输出:[1,2] 示例 3: 输入:nums = [3,3], target = 6 输出:[0,1] 提示: 2 <= nums.length if nums[i] + nums[j] == target: return [i, j] return [] 复杂度分析 时间复杂度:O(N^2) ,其中 N 是数组中的元素数量;最坏情况下数组中任意两个数都要被匹配一次 空间复杂度:O(1) 正确答案二:哈希表 def twoSum2(nums: List[int], target: int) -
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。 您可以假设除了数字 0 之外,这两个数都不会以 0 开头。 示例: 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807 来源:力扣(LeetCode) 链接:https://leetcode-cn.com
文章目录 1.问题描述 2.难度等级 3.热门指数 4.解题思路 5.实现示例 5.1 C++ 5.2 Golang 参考文献 1.问题描述 给你两个非空的链表,表示两个非负的整数。 具体而言,如果当前两个链表处相应位置的数字为 n1 和 n2,结果为 (n1+n2) mod 10,进位为 (n1+n2) / 10。 nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(next) {} * }; */ // addTwoNumbers 两数相加 * type ListNode struct { * Val int * Next *ListNode * } */ // addTwoNumbers 两数相加。 两数相加 - LeetCode
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 =null||l2!=null){ x=l1==null? 0: l1.val; y=l2==null? 0 : l2.val; sum=x+y+carry; carry=sum/10; cur.next=new ListNode(sum%10); =null){ l1=l1.next; } if(l2! =null){ l2=l2.next; } } if(carry==1){//如果有进位, 下一位默认是1 cur.next
给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。 你可以假设除了数字 0 之外,这两个数字都不会以零开头。 =null || l2!=null || temp!=0){ // 两个数的当前位相加,加上之前的进位 int sum =(l1!=null? l1.val:0)+(l2!=null? l1.next:l1; l2= (l2!=null)? l2.next:l2; } return result.next; } } 【作者简介】: 秦怀,公众号【秦怀杂货店】作者,技术之路不在一时,山高水长,纵使缓慢
题目描述 给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。 您可以假设除了数字 0 之外,这两个数都不会以 0 开头。 思路 设立一个表示进位的变量carried,建立一个新链表, 把输入的两个链表从头往后同时处理,每两个相加,将结果加上carried后的值作为一个新节点到新链表后面。 ? 描述 将两个链表的第一个节点值相加,结果转为0-10之间的个位数,并设置进位信息 将两个链表第一个节点以后的链表做带进位的递归相加 将第一步得到的头节点的next指向第二步返回的链表 C++实现 // l1 : l1->next, l2 == nullptr ? l2 : l2->next, carry / 10); } };
不时更新力扣题库,使用python实现,比较通俗易懂,其中注释是我自己的理解: # 输入:l1 = [2,4,3], l2 = [5,6,4] # 输出:[7,0,8] # 解释:342 + 465 = : # 如果有一个listnode没有填写,就返回剩下一个即可 if l1 == None: return l2 if l2 == while l2: p.next = ListNode((l2.val + carry) % 10) carry = (l2.val + carry) // 10 # 更新carry位 l2 = l2.next # 更新l1,去掉当前头部第一个元素 (l1, l2) print(res.val)
p1.val:0; const v2=p2? 如何遍历两个链表? 两个指针。 let p1=l1; let p2=l2; let p3=q; 第三个指针是新建的链表,相同的位想加后是要存储的。 while(p1||p2) 如果两个中任何一个还有值就继续遍历,为什么? 因为还没完呢啊。。。。 还有一个问题就是一长一短怎么办?p1与p2都有可能哦。 const v1=p1? carry=Math.floor(val/10); 放到相加的操作上. const val=v1+v2+carry; 然后是把个位上的数加到新链表上。 carry=Math.floor(val/10); p3.next=new ListNode(val%10); 这两句第一个是截图十位,等到下一次循环在下位相加所以不管它了。
给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。 你可以假设除了数字 0 之外,这两个数字都不会以零开头。 = null || l2 != null) { int d1 = l1 == null ? 0 : l1.val; int d2 = l2 == null ? 0 : l2.val; int sum = d1 + d2 + carry; carry = sum >= 10 ? = null) { l2 = l2.next; } } if (carry == 1) cur.next = new
题目 给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。 您可以假设除了数字 0 之外,这两个数都不会以 0 开头。 = ListNode(l2) re = ListNode(0) r = re carry = 0 while (l1 or l2): x = l1.val if l1 else 0 y = l2.val if l2 else 0 z = x + y + carry = None): l2 = l2.next #最后进位 if carry > 0: r.next = ListNode(1) return
给定一个已按照*升序排列* 的有序数组,找到两个数使得它们相加之和等于目标数。 函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。 说明: 返回的下标值(index1 和 index2)不是从零开始的。 你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。 示例: 输入: numbers = [2, 7, 11, 15], target = 9 输出: [1,2] 解释: 2 与 7 之和等于目标数 9 。 因此 index1 = 1, index2 = 2 。 Discussion | Solution 如果没有解怎么样?保证有解 如果有多个解怎样? 返回任意解 思考一:暴力解法 双层遍历,O(n^2) 暴力解法没有充分利用原数组的性质 -- 有序 思考二:有序?二分搜索? 既然数组是有序的,是否可以考虑使用二分搜索的思想?
题目链接 https://leetcode-cn.com/problems/add-two-numbers/ 题目描述 给你两个非空的链表,表示两个非负的整数。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字0之外,这两个数都不会以0开头。 示例图 分析 1.参数是两个链表,两个链表可能包含空链表,可能两个链表长度不同,我们应该将较长的链表遍历完,才能得到最终结果;当长链表没有遍历完,短链表遍历完时,应该补0相加; 2.当两个数字相加之后, 进入循环,进入循环的条件为,两个链表有一个不为空: 即: while(l1 ! = null || l2 != null) 循环内部: 需要有两个数字保存两个链表对应的数值: int num1 = l1==null?
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外,这两个数都不会以 0 开头。 示例 1: 输入:l1 = [2,4,3], l2 = [5,6,4] 输出:[7,0,8] 解释:342 + 465 = 807. 示例 2: 输入:l1 = [0], l2 = [0] 输出:[0] 示例 3: 输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9] 输出:[8,9,9,9,0,0,0,1 || index){ if(l1)index += l1->val; if(l2)index += l2->val; ListNode l2 = l2->next; } return T; } }; 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/168892.
这次来写一下 LeetCode 的第 2 题,两数相加。 题目描述 题目直接从 LeetCode 上截图过来,题目如下: ? 上面的题就是 两数相加 题目的截图,同时 LeetCode 会根据选择的语言给出了一个类的定义或者函数的定义,然后在其中实现 两数相加 的解题过程。这次我使用 C 语言来进行完成。 { } 通过函数定义可以看出,addTwoNumbers 函数的参数是两个单向链表,然后返回值也是一个链表,然后我们要做的就是让两个链表的每个节点相加,并产生新的节点构成一个新的链表,并且链表上的每个节点只能存储一位数 两个链表的每个节点相加,然后所得的结果存在一个新的链表节点当中,且这个节点中只能存一位数。 { if (l1 == NULL) { return l2; } if (l2 == NULL) { return l1; }