2021年阿里笔试题分享——大数相加(附源码)

article/2025/9/30 2:07:40

2021年阿里笔试题分享(一)

  • 原题描述
  • 审题
  • 做题过程还原
  • 思路

原题描述

废话不多说,这道题题目描述如下

/*** Alipay.com Inc.* Copyright (c) 2004-2021 All Rights Reserved.*///对单链表表示的大数进行求和:1->2->3+4->5=1->6->8 (123+45=168)。

审题

 这是我们这个系列第一篇文章,首先来分享一道阿里笔试题。阿里一般是面试官通过邮件发送过来,要求一个小时内完成。其实时间还是挺紧的,一般做题步骤是15-20分钟左右思考,然后30-40分钟编写代码。对于笔试经验少的童鞋,最好多拿几家笔试来练练手,否则容易一上来紧张后懵了。
 为什么先选这道题来讲,目的就是给童鞋们敲一个警钟,很多童鞋一般喜欢买个刷题课程或者看别人文章,很多课程基本都是把一些代表性的LeetCode题目解法讲一遍。作为过来人可以很负责的告诉你。如果只靠这些就觉得自己已经掌握了LeetCode上的题目那就大错特错了。因为不经过平时自我严格的训练,很可能由于紧张现场翻车。

做题过程还原

 刚拿到题目的时候千万不能慌,先多读读题。这道题的意思是两个非空单链表,并且每个节点只能存储一位数字。请你将两个数相加,并以相同形式返回一个表示和的链表。

思路

对于阿里好多笔试题并不是LeetCode原题,但是这个题其实和LeetCode的第2题两数相加非常像了。区别就是LeetCode的第2题中的题目已经把链表转置好了,结果不需要转置回去。
所以看到了吧,大家平时要刷题的话题目一定要首先自己做一做才能加深印象,笔试的时候才不会怕。这个题的思路如下

  1. 将两个链表进行转置;
  2. 创建新链表;
  3. 同时遍历两个链表,逐位计算它们的和,并与当前位置的进位值相加。假设当前两个链表处相应位置的数字为 n1,n2,假设进位值为 carry,则它们的和为 n1+n2+carry。每一位计算的同时需要考虑上一位的进位问题,而当前位计算结束后同样需要更新进位值
  4. 如果两个链表全部遍历完毕后,进位值为 1,则在新链表最前方添加节点 1。
  5. 对新链表进行转置

在这里插入图片描述

该题代码如下

public class BigSum {static class ListNode {private ListNode next;private int value;ListNode(int value) {this.value = value;}public ListNode getNext() {return next;}public void setNext(ListNode next) {this.next = next;}public int getValue() {return value;}public void setValue(int value) {this.value = value;}}public static  ListNode addTwoList(ListNode first, ListNode second) {//必须合法if (null == first || null == second) {return null;}ListNode reverseFirst = reverseList(first);ListNode reverseSend = reverseList(second);ListNode temFirst = reverseFirst;ListNode temSecond = reverseSend;ListNode resultList = new ListNode(-1);ListNode p = resultList;int flag = 0;while (temFirst != null || temSecond != null) {int temp = flag;if (temFirst != null) {temp += temFirst.value;temFirst = temFirst.next;}if (temSecond != null) {temp += temSecond.value;temSecond = temSecond.next;}if (temp > 9) {temp -= 10;flag = 1;} else {flag = 0;}ListNode node = new ListNode(temp);p.next = node;p = p.next;}if (flag == 1) {ListNode node = new ListNode(1);p.next = node;}return reverseList(resultList.next);}//翻转链表public static ListNode reverseList (ListNode targetList) {ListNode newhead = null;while (targetList != null) {ListNode temp = targetList.next;targetList.next = newhead;newhead = targetList;targetList = temp;}return newhead;}// 1->2->3+4->5=1->6->8 (123+45=168)public static void main(String[] args) {ListNode first = new ListNode(1);ListNode two = new ListNode(2);ListNode three = new ListNode(3);first.setNext(two);two.setNext(three);ListNode second = new ListNode(4);ListNode five = new ListNode(5);second.setNext(five);ListNode result =  addTwoList(first,second);}}

http://chatgpt.dhexx.cn/article/nK4P0BfK.shtml

相关文章

阿里笔试题

1 小刘家里有n个鸟蛋,大小为a_i,并且大小互不相同,他有n个孵蛋器,第i个孵蛋器每天可以长大i。那么最早几天会有同样大小的蛋出现,规则:最大的鸟蛋放最慢的,最小的放最快的,其它依类…

大数据阿里面试笔试题总结,我的结果 当然是凉凉

我 秀儿 在学习大数据一年后去了阿里面试,这是我笔试的时候题目,虽然我凉了,但是希望大家加油 总结给大家看看 参考下面的M R系统的场景:HDFS 块大小为64MB;输入类型为FileInputFormat;有三个文件大小分别是: 0.在Hadoop中定义的主要公用InputFormat中,默认是哪一个…

阿里20道经典测试题,一个月吐血整理,你会几题?背下来,帮你成功就业(有答案版)

一、怎样把自动化测试在公司中实施并推广起来? 1、项目组调研选择自动化工具并开会演示demo案例,我们主要是演示selenium和robotframework两种。 2、搭建自动化测试框架,在项目中逐步开展自动化。 3、把该项目的自动化流程、框架固化成文档…

数据结构(使用头插法实现单链表)

一.定义 1.线性表的链式存储就是单链表,单链表通过一组任意的存储单元来存储线性表的数据元素(逻辑相邻,存储离散),单链表对于每一个链表结点,不但存储自身数据,还开辟了存储一个指向后继结点的…

【Java】JDK 7 HashMap 头插法在并发情况下的成环问题

CONTENT 问题描述成因详解总结Reference 问题描述 JDK 7 的 HashMap 解决冲突用的是拉链法,在拉链的时候用的是头插,每次在链表的头部插入新元素。resize() 的时候用的依然是头插,头插的话,如果某个下标中的链表在新的 table 中依…

java 如何实现单链表中的头插法

文章目录 头插法1 思路2 插入过程2.1 定义node节点2.2 将node插入到原来head前面的位置2.3 将node节点与下一个结点链接起来2.4 更改head的指向 3 注意点4 为空的情况5 代码实现 头插法 1 思路 先定义一个新的节点,命名为node。将node插入到原来单链表头节点的前面…

头插法建立链表详解

头插法就是建立一个头节点,进行初始化定义,next存储下一个节点位置的地址,初始化定义指针域为空,表示该头部节点后面指向任何位置的地址,开始时只有一个头部节点。 head -> next NULL; 图形化表示为 申请一个新节…

头插法创建单链表

1.对单链表的解释 链表与顺序表不同,它是一种动态管理的存储结构,链表中的每个结点占用的存储空间不是预先分配的,而是运行时系统根据需求生成的,因此建立单列表要从空表开始,每读入一个数据元素则申请一个结点&#…

头插法逆置单向链表c语言,单链表的逆置(头插法和就地逆置)

今天课间的时候偶然看到了一个面试题:单链表的逆置,看了题解感觉乖乖的,貌似和以前看的版本不搭,于是重新进行了一番探究 单链表的逆置分为两种方法:头插法和就地逆置法,这两种方法虽然都能够达到逆置的效果…

头插法和尾插法

链表的头插法和尾插法 表结构的声明 typedef int ElemType; typedef struct node //定义链表的结点的结构 {ElemType data;//定义链表的数据域struct node *next;//定义链表中的指针域 }slink;头插法 1,从一个空表开始,重复读入数据,生成新…

单链表之头插法

1、前言: 什么是头插法?说白了头插法就是新增节的点总是插在头节点后面,然后大家可能会有疑惑,什么是新增节点,什么是头节点呢,下面请听俺娓娓道来。。。 2、预前准备: 头节点:一…

单链表的头插法和尾插法的示例

单链表是数据结构中最基本的数据结构,单链表有头插法和尾插法,今天有空把这两者做成一个实验示例以作比较。 提示:编译代码是否通过可能与编译器的版本有关,本程序是在 Android 操作系统下的 Compiler C语言编译器下编译通过。 一…

头插法实现单链表逆置

在头结点的后面依次插入后面的结点,q从第二个结点向后移动遍历,p永远在第一个结点完成头插法逆置单链表。 void reverseL(Linklist &L){//头插法逆转单链表if(L!NULL){LNode* pL->next;//p等于第一个结点LNode* qp->next;//q等于第二个结点p-…

HashMap/ConcurrentHashMap/头插法/尾插法

1.1 HashMap JDK1.7 JDK1.8 存储 数组链表 数组链表红黑树 位置算法 h & (length-1) h & (length-1) 链表超过8 链表 红黑对(链表超过8且数组长度超64) 节点结构 Entry<K,V> implements Map.Entry<K,V> Node<K,V> implements Map.Entry…

C语言 链表 头插法

代码&#xff08;VS2017中运行&#xff09; #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct student {int num;float score;struct student *pnext;//*pnext存的是下一个节点的首地址 }stu,*pst…

头插法建立单链表

头插法建立单链表图示过程&#xff08;其中an表示时间上第n个建立的节点&#xff0c;L为头指针&#xff0c;箭头表指向&#xff0c;sn代表an的地址&#xff09; 结构体代码与主函数如下&#xff1a; struct Link //创建一个结构体类型 {int data; //数据域struct Link* p; /…

Java实现头插法

实现原理&#xff1a; 这是第一个头结点&#xff0c;现在要插入一个节点&#xff0c;也就是让新节点指向该头结点&#xff0c;任何让head指向新节点&#xff0c;新节点变为头结点。 代码实现&#xff1a; 实体类&#xff1a; public class entity {private String data;privat…

单链表的头插法

链表与顺序表不同链表是用一组任意的储存单元来存放线性表的结点&#xff0c;这组结点可以是连续的&#xff0c;也可以是非连续的&#xff0c;甚至可以是零散分布在内存的任何位置&#xff0c;为了能正确的去表达结点的逻辑关系&#xff0c;必须在储存元素值的同时&#xff0c;…

HashMap在JDK1.7版本头插法实现解析

HashMap在JDK1.7版本头插法实现解析 先解释下何为头插法。大家都知道HashMap在JDK1.7版本的数据结构为数组链表这样的形式。而头插法说的就是在往HashMap里面put元素时&#xff0c;此时新增在链表上元素的位置为链表头部&#xff0c;也就是数组桶位上的那个位置&#xff0c;故…

头插法链表反转c语言,用头插法反转链表

题目&#xff1a;输入一个链表的头结点&#xff0c;反转该链表&#xff0c;并返回反转后链表的头结点。 链表结点定义如下&#xff1a; typedef char item_t; typedef struct node { item_t item; struct node * next; } node_t; 分析&#xff1a; 使用头插法可以快速实现反转。…