面试题5:从尾到头打印链表 提交网址: http://www.nowcoder.com/practice/d0267f7f55b3412ba93bd35cfa8e8035?tpId=13&tqId=11156 本题知识点: 链表 题目描述 输入一个链表,从尾到头打印链表每个节点的值.  输入描述: 输入为链表的表头 输出描述: 输出为需要打印的"新链表"的表头 分析: 此题要求返回类型为vector<int>,故有两种方法: 1. 使用vector容器在头部进行插入…
面试题 6. 从尾到头打印链表 NowCoder 题目描述 输入一个链表的头结点,从尾到头反过来打印出每个结点的值. Java 实现 ListNode Class class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } @Override public String toString() { return val + "->" + next; } } 使用递归 im…
题目:打印1到最大的n位数 输入数字n,按顺序打印输出从1到最大的n位十进制数,比如输入3,打印从1到999. 这道题考察的地方是如何表示大数问题.由于n是任意大的数组,如果n太大的话n位数就超过了long型能够表示的范围,在面试题11求数值的整数次方的时候题目中已经明确的提示了不考虑大数问题,在这道题中,用字符串或者数组表示大数是一种很简单有效的方法.用字符串表示大数也适用于大数加法.大数减法和大数的乘法问题. 下面代码是使用数组方式实现大数的产生和打印,在这道题中要特殊考虑的地方是如果实现整…
题目: 输入一个链表的头结点,从尾到头反过来打印出每个节点的值.链表结点定义如下: struct ListNode { int m_nKey; ListNode* m_pNext; }; 思路: 通常打印是一个只读操作,我们不希望打印时修改内容,所以这个题目在遍历过程中,不能修改链表的值.逆序打印链表,操作正好符合堆栈的数据结果. Java代码实现: import java.util.ArrayList; import java.util.Stack; public class Solution…
题目描述 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. 编程思想 从前往后遍历,将值存入栈中,然后打印栈中内容即可. 编程实现 /** * struct ListNode { * int val; * struct ListNode *next; * ListNode(int x) : * val(x), next(NULL) { * } * }; */ class Solution { public: vector<int> printListFromTailToHead…
问题描述:输入一个链表的头结点,从尾巴到头反过来打印出每个结点的值. 首先定义链表结点 public class ListNode { int val; ListNode next = null; ListNode(int val){ this.val = val; } } 思路1:此题明显想到是利用栈的思想,后进先出,先遍历链表,依次将结点值进栈.最后在遍历栈出栈. public static Stack<Integer> printListReverse_Stack(ListNode li…
书中方法一:反转应该立刻想到栈,利用一个栈完成链表的反转打印,但是用了额外的O(n)空间. public void printFromTail(ListNode first){ Stack<ListNode> stack = new Stack<ListNode>(); while(first != null){ stack.push(first); first = first.next; } while(!stack.isEmpty()){ System.out.print(st…
一.前言 刷题平台:牛客网 二.题目 输入一个链表,返回一个反序的链表. 1.思路 通常,这种情况下,我们不希望修改原链表的结构.返回一个反序的链表,这就是经典的"后进先出",我们可以使用栈实现这种顺序.每经过一个结点的时候,把该结点放到一个栈中.当遍历完整个链表后,再从栈顶开始逐个输出结点的值,给一个新的链表结构,这样链表就实现了反转. 2.代码 Python: 直接使用列表的插入方法,每次插入数据,只插入在首位. # -*- coding:utf-8 -*- # class Lis…
一.题目:从尾到头打印链表 题目:输入一个链表的头结点,从尾到头反过来打印出每个结点的值. 到解决这个问题肯定要遍历链表.遍历的顺序是从头到尾的顺序,可输出的顺序却是从尾到头.也就是说第一个遍历到的结点最后一个输出,而最后一个遍历到的结点第一个输出.这就是典型的“后进先出”,我们可以用栈实现这种顺序. 二.解题思路 每经过一个结点的时候,把该结点放到一个栈中.当遍历完整个链表后,再从栈顶开始逐个输出结点的值,此时输出的结点的顺序已经反转过来了. 三.解决问题 3.1 代码实现 这里使用的是自定义…
#include"iostream" #include"stdio.h" #include"stack" using namespace std; struct ListNode { int value; ListNode *pNext; }; ListNode* CreatListNode(int x) { ListNode *pNode=new ListNode(); pNode->pNext=nullptr; pNode->va…
重要思路: 这个问题肯定要遍历链表,遍历链表的顺序是从头到尾,而要输出的顺序却是从尾到头,典型的“后进先出”,可以用栈实现. 注意stl栈的使用,遍历stack的方法. #include <iostream> #include <stack> using namespace std; class Node { public: Node(int v, Node* n) {val = v; next = n;} ~Node(){} int val; Node* next; }; Nod…
题目:输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. 分析:若不允许修改原链表的值,则可以使用栈来实现,也可以使用另外一个ArrayList做中转的数据. public ArrayList<Integer> printListFromTailToHead(ListNode listNode) { ArrayList<Integer> arrayList = new ArrayList<>(); Stack<Integer> stack =…
题目 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回). 示例 1: 输入:head = [1,3,2] 输出:[2,3,1] 限制: 0 <= 链表长度 <= 10000 思路一:反转数组 代码 时间复杂度:O(n) 空间复杂度:O(1) class Solution { public: vector<int> reversePrint(ListNode* head) { vector<int> res; if (!head) return res;…
问题描述 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回). 示例 1: 输入:head = [1,3,2] 输出:[2,3,1] 限制: 0 <= 链表长度 <= 10000 代码 /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class So…
题目描述* 剑指offer面试题5:从尾到头打印链表 输入一个链表的头结点,从尾到头打印出每个结点的值 解决方案一:首先遍历链表的节点后打印,典型的"后进先出",可以使用栈来实现这种顺序.解决方案二:栈的本质就是递归,直接使用递归的方式,打印一个节点的时候先打印它后面的节点,再打印该节点自身,实现反向打印解决方案三:遍历链表,把链表中的元素复制到ArrayList中,然后逆序打印ArrayList中的元素解决方案四:前三种解决方案本身属于在打印链表的时候不修改链表本身结构,在允许修改链…
题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点. 由于给定的是单向链表,正常删除链表的时间复杂度是查找链表的时间复杂度即O(n),如果要求在O(1)时间复杂度内删除节点,通过遍历链表找到该节点的上一节点和下一节点的方法是行不通了.所以实现的思路是,根据给定的要删除的节点,可以直接找到其后年的节点,把后面的节点的内容复制到当前节点处,同时将当前节点指向其后面节点的后面节点保证链表不断开,再把下一节点删掉就相当于把给定的节点删除了. 需要考虑到的一点是,如果要删除的节…
用字符串或者数组表示大数是一种很简单有效的表示方式.在打印1到最大的n为数的问题上采用的是使用数组表示大数的方式.在相关题实现任意两个整数的加法.减法.乘法的实现中,采用字符串对大数进行表示,不过在具体的计算中,还是要将字符串转化成字符数组来进行计算. 实现两个大数的加法,要考虑到两个问题,两个数的和的位数问题,以及如何处理两个数按位相加产生的进位问题.首先两个整数相加,两个数的和的位数最多比最大的整数的位数多1:这样和的位数就确定了.对于进位问题,我的做法是先进行按位相加,相加操作完成后再按照…
题目: 请实现一个函数,输入一个整数,输出该整数二进制表示中1的个数.例如,把9表示成二进制是1001,有2位是1,该函数输出2解法:把整数减一和原来的数做与运算,会把该整数二进制表示中的最低位的1变成0,与运算进行多少次就有多少个1. package Solution; /** * 剑指offer面试题10:二进制中1的个数 * 题目:请实现一个函数,输入一个整数,输出该整数二进制表示中1的个数. * 例如,把9表示成二进制是1001,有2位是1,该函数输出2 * 解法:把整数减一和原来的数做…
剑指offer面试题7相关题目:用两个队列实现一个栈 解题思路:根据栈的先入后出和队列的先入先出的特点1.在push的时候,把元素向非空的队列内添加2.在pop的时候,把不为空的队列中的size()-1份元素poll出来,添加到另为一个为空的队列中,再把队列中最后的元素poll出来两个队列在栈不为空的情况下始终是有一个为空,另一个不为空的.push添加元素到非空的队列中,pop把非空队列的元素转移到另一个空的队列中,直到剩下最后一个元素,这个元素就是要出栈的元素(最后添加到队列中的元素). pa…
题目:用两个栈实现一个队列.队列的声明如下:请实现他的两个函数appendTail和deleteHead, 分别完成在队列尾部插入节点和在队列头部删除节点的功能. package Solution; import java.util.Stack; /** * 剑指offer面试题7:用两个栈实现队列 * 题目:用两个栈实现一个队列.队列的声明如下:请实现他的两个函数appendTail和deleteHead, * 分别完成在队列尾部插入节点和在队列头部删除节点的功能. * @author GL…
题目描述 请实现一个函数,将一个字符串中的空格替换成"%20".例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. package Solution; /** * 剑指offer面试题4:替换空格 * 题目:请事先一个函数,把字符串中的每个空格替换成"%20". * 例如输入"We are happy.",则输出"We%20are%20happy.". * @author GL…
题目: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出二叉树并输出他的根节点. 在二叉树的前序遍历中,第一个数字总是树的根节点.在中序遍历中,树的根节点在序列的中间,左子树的节点的值位于根节点的左边,右子树节点的值位于根节点值的右边. 因此需要扫描中序遍历序列才能找到很结点的值,由此可以找到左子树的节点的个数和右子树节点的…
题目: 实现函数double power(double base,int exponent),求base的exponent次方.不得使用库函数,同时不需要考虑大数问题. 解题思路:最一般的方法实现数值的n次方就是将一个数自身连乘n次底数要考虑到正数.负数和零的情况指数要考虑到正整数,负整数和零的情况.可能的情况有九种,其中尤其要注意底数为0,指数为负数的情况下是无意义的,因此要做特殊处理指数为负数的乘方运算,可先按照指数为正求得,然后求倒数得到真正结果解法一:全面不高效,考虑到所有边界条件和负面…
题目: 输入一个整数数组,实现一个函数来调整该数组中数组的顺序,使得所有的奇数位于数组的前半部分,偶数位于数组的后半部分. 解题思路:数组中维护两个指针,第一个指针初始化时候指向数组头部,第二个指针初始化时候指向数组尾部,第一个指针指向的数字总是偶数,第二个指针指向的数字总是奇数,如果第一个指针在第二个指针之前,则交换两指针指向的元素. package Solution; /** * 剑指offer面试题14:调整数组顺序是奇数位于偶数前面 * 题目:输入一个整数数组,实现一个函数来调整该数组中…
题目:写一个函数,输入n,求斐波那契数列的第n项. package Solution; /** * 剑指offer面试题9:斐波那契数列 * 题目:写一个函数,输入n,求斐波那契数列的第n项. * 0, n=1 * 斐波那契数列定义如下:f(n)= 1, n=2 * f(n-1)+f(n-2), n>2 * @author GL * */ public class No9Fibonacci { public static void main(String[] args) { System.out…
剑指offer面试题8:旋转数组的最小数字 题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1 旋转数组的特点: 1,旋转之后的数组可以分为两个排序的子数组,且前面的子数组的元素都大于或等于后面子数组的元素. 2,最小或者最大元素位于两个子数组的分界 解题思路:在排序数组中,可以使用二分查找法进行查找 利用左右两个指针和中间指针元素大…
题目描述 请实现一个函数,将一个字符串中的空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. package Solution; /** * 剑指offer面试题4:替换空格 * 题目:请事先一个函数,把字符串中的每个空格替换成"%20". * 例如输入"We are happy.",则输出"We%20are%20happy.". * @author GL * */ publ…
题目描述: 有两个排序的数字A1和A2,内存在A1的末尾有足够多的空余空间容纳A2.请实现一个函数,把A2中的所有数字插入到A1中并且所有的数字是排序的. 还是利用从后向前比较两个数组中的数字的方式来实现. package Solution; /** * 有两个排序的数字A1和A2,内存在A1的末尾有足够多的空余空间容纳A2. * 请实现一个函数,把A2中的所有数字插入到A1中并且所有的数字是排序的. * @author GL * 本题应该注意Java中不可变数组的性质,所以用创建新数组接受插入…
面试题三:查找二维数组中元素问题 public static void main(String[] args){ int[][] num = {{1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15}}; search(num,7); } public static void search(int[][] arr,int target){ int rows = arr.length; int columns = arr[0].length; int row = 0…
题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数.   下面是我实现的代码,修改下类名(Solution)和方法名(Find)通过了牛客网的测试用例 public class No2Array{ public static void main(String[] args){ int[][] array={{1,2,8,9}, {2,4,9,12}, {4,7,10,13}…