面试大总结之一:Java搞定面试中的链表题目

面试大总结之二:Java搞定面试中的二叉树题目 这是本系列的第二篇,与前一篇 面试大总结之一:Java搞定面试中的链表题目 相比,二叉树的题目可以变化的就更多了。本文还是参考整合重写了《轻松搞定面试中的二叉树题目》和《算法大全(3) 二叉树》两篇大作。本文一个小亮点就是几乎每一道题都用了递归和迭代两种方法写过一遍,因为面试时往往可能会被要求写不擅长的那一种。这一千多行的记录也是我在面试摸索过程中的一个小笔记,备份与此。请大神们轻拍指正。今后 阅读详情

链表是面试中常出现的一类题目,本文用Java实现了面试中常见的链表相关题目。本文主要参考整合重写了《轻松搞定面试中的链表题目》和 《算法大全(1)单链表》两篇大作。两篇大神的实现分别是C和C#,因为我更喜欢用Java面试,所以用Java重写了所有实现,并附上自己的一些思考注释。算法大全(1)单链表 尚未有一些问题尚未整合进来,很快我会更新本文。接下来还会出关于二叉树的大总结和栈和队列的大总结。因为这些都属于面试中的送分题!必须毫无偏差地拿下。至于像动态规划这些比较“高端”的算法,就只能靠日积月累,而不能像这样临时突击了。


第二篇: 《面试大总结之二:Java搞定面试中的二叉树题目》已经出炉!



package LinkedListSummary;

import java.util.HashMap;
import java.util.Stack;

/**
 * http://blog.youkuaiyun.com/luckyxiaoqiang/article/details/7393134 轻松搞定面试中的链表题目
 * http://www.cnblogs.com/jax/archive/2009/12/11/1621504.html 算法大全(1)单链表
 * 
 * 目录:
 * 1. 求单链表中结点的个数: getListLength
 * 2. 将单链表反转: reverseList(遍历),reverseListRec(递归)
 * 3. 查找单链表中的倒数第K个结点(k > 0): reGetKthNode
 * 4. 查找单链表的中间结点: getMiddleNode
 * 5. 从尾到头打印单链表: reversePrintListStack,reversePrintListRec(递归)
 * 6. 已知两个单链表pHead1 和pHead2 各自有序,把它们合并成一个链表依然有序: mergeSortedList, mergeSortedListRec
 * 7. 判断一个单链表中是否有环: hasCycle
 * 8. 判断两个单链表是否相交: isIntersect
 * 9. 求两个单链表相交的第一个节点: getFirstCommonNode
 * 10. 已知一个单链表中存在环,求进入环中的第一个节点: getFirstNodeInCycle, getFirstNodeInCycleHashMap
 * 11. 给出一单链表头指针pHead和一节点指针pToBeDeleted,O(1)时间复杂度删除节点pToBeDeleted: delete
 * 
 */
public class Demo {

	public static void main(String[] args) {
		Node n1 = new Node(1);
		Node n2 = new Node(2);
		Node n3 = new Node(3);
		Node n4 = new Node(4);
		Node n5 = new Node(5);
		n1.next = n2;
		n2.next = n3;
		n3.next = n4;
		n4.next = n5;

		printList(n1);
//		System.out.println(getListLength(n1));
//		Node head = reverseList(n1);
//		Node head = reverseListRec(n1);
//		printList(head);

		Node x = reGetKthNode(n1, 2);
		System.out.println(x.val);
		reGetKthNodeRec(n1, 2);
		
		
//		x = getMiddleNode(head);
//		System.out.println(x.val);
//		System.out.println("reversePrintListStack:");
//		reversePrintListStack(head);
//		System.out.println("reversePrintListRec:");
//		reversePrintListRec(head);

	}

	
//	public static void main(String[] args) {
//		Node n1 = new Node(1);
//		Node n2 = new Node(3);
//		Node n3 = new Node(5);
//		n1.next = n2;
//		n2.next = n3;
//
//		Node m1 = new Node(1);
//		Node m2 = new Node(4);
//		Node m3 = new Node(6);
//		m1.next = m2;
//		m2.next = m3;
//		
//		
//		Node ret = mergeSortedList(n1, m1);
//		printList(ret);
//	}

	private static class Node {
		int val;
		Node next;

		public Node(int val) {
			this.val = val;
		}
	}

	public static void printList(Node head) {
		while (head != null) {
			System.out.print(head.val + " ");
			head = head.next;
		}
		System.out.println();
	}

	// 求单链表中结点的个数
	// 注意检查链表是否为空。时间复杂度为O(n)
	public static int getListLength(Node head) {
		// 注意头结点为空情况
		if (head == null) {
			return 0;
		}

		int len = 0;
		Node cur = head;
		while (cur != null) {
			len++;
			cur = cur.next;
		}
		return len;
	}

	// 翻转链表(遍历)
	// 从头到尾遍历原链表,每遍历一个结点,
	// 将其摘下放在新链表的最前端。
	// 注意链表为空和只有一个结点的情况。时间复杂度为O(n)
	public static Node reverseList(Node head) {
		// 如果链表为空或只有一个节点,无需反转,直接返回原链表表头
		if (head == null || head.next == null) {
			return head;
		}

		Node reHead = null; 		// 反转后新链表指针
		Node cur = head;

		while (cur != null) {
			Node preCur = cur; 		// 用preCur保存住对要处理节点的引用
			cur = cur.next; 			// cur更新到下一个节点
			preCur.next = reHead;	// 更新要处理节点的next引用
			reHead = preCur; 			// reHead指向要处理节点的前一个节点
		}

		return reHead;
	}
	
	// 翻转递归(递归)
	// 递归的精髓在于你就默认reverseListRec已经成功帮你解决了子问题了!但别去想如何解决的
	// 现在只要处理当前node和子问题之间的关系。最后就能圆满解决整个问题。
	/*
		 head
			1 -> 2 -> 3 -> 4
		
		  head
			1--------------
			                    |
	               4 -> 3 -> 2							// Node reHead = reverseListRec(head.next);
	           reHead      head.next
	        
	               4 -> 3 -> 2 -> 1					// head.next.next = head;
	           reHead
	           
	                4 -> 3 -> 2 -> 1 -> null			// head.next = null;
	           reHead
	 */
	public static Node reverseListRec(Node head){
		if(head == null || head.next == null){
			return head;
		}
		
		Node reHead = reverseListRec(head.next);	
		head.next.next = head;		// 把head接在reHead串的最后一个后面
		head.next = null;				// 防止循环链表
		return reHead;
	}

	/**
	 * 查找单链表中的倒数第K个结点(k > 0)
	 * 最普遍的方法是,先统计单链表中结点的个数,然后再找到第(n-k)个结点。注意链表为空,k为0,k为1,k大于链表中节点个数时的情况
	 * 。时间复杂度为O(n)。代码略。 这里主要讲一下另一个思路,这种思路在其他题目中也会有应用。
	 * 主要思路就是使用两个指针,先让前面的指针走到正向第k个结点
	 * ,这样前后两个指针的距离差是k-1,之后前后两个指针一起向前走,前面的指针走到最后一个结点时,后面指针所指结点就是倒数第k个结点
	 */
	public static Node reGetKthNode(Node head, int k) {
		// 这里k的计数是从1开始,若k为0或链表为空返回null
		if (k == 0 || head == null) {
			return null;
		}

		Node q = head; // q在p前面  p--q
		Node p = head; // p在q后面

		// 让q领先p距离k
		while (k > 1 && q != null) {
			q = q.next;
			k--;
		}

		// 当节点数小于k,返回null
		if (k > 1 || q == null) {
			return null;
		}

		// 前后两个指针一起走,直到前面的指针指向最后一个节点
		while (q.next != null) {
			p = p.next;
			q = q.next;
		}

		// 当前面的指针指向最后一个节点时,后面的指针指向倒数k个节点
		return p;
	}
	
	
	
	/**
	 * 递归打印出倒数第k位的值
	 * @param head
	 * @param dist
	 */
	static int level = 0;
	public static void reGetKthNodeRec(Node head, int k) {
		
        if(head == null){
            return;
        }
        if(k == 1){
            return;
        }
        
        reGetKthNodeRec(head.next, k);
        level++;
        if(level == k) {
            System.out.println(head.val);
        }
    }
	
	
	

	// 查找单链表的中间结点
	/**
	 * 此题可应用于上一题类似的思想。也是设置两个指针,只不过这里是,两个指针同时向前走,前面的指针每次走两步,后面的指针每次走一步,
	 * 前面的指针走到最后一个结点时,后面的指针所指结点就是中间结点,即第(n/2+1)个结点。注意链表为空,链表结点个数为1和2的情况。时间复杂度O(n
	 */
	public static Node getMiddleNode(Node head) {
		if (head == null || head.next == null) {
			return head;
		}

		Node q = head;		// p---q 
		Node p = head;

		// 前面指针每次走两步,直到指向最后一个结点,后面指针每次走一步
		while (q.next != null) {
			q = q.next;
			p = p.next;
			if (q.next != null) {
				q = q.next;
			}
		}
		return p;
	}

	/**
	 * 从尾到头打印单链表
	 * 对于这种颠倒顺序的问题,我们应该就会想到栈,后进先出。所以,这一题要么自己使用栈,要么让系统使用栈,也就是递归。注意链表为空的情况
	 * 。时间复杂度为O(n)
	 */
	public static void reversePrintListStack(Node head) {
		Stack<Node> s = new Stack<Node>();
		Node cur = head;
		while (cur != null) {
			s.push(cur);
			cur = cur.next;
		}

		while (!s.empty()) {
			cur = s.pop();
			System.out.print(cur.val + " ");
		}
		System.out.println();
	}

	/**
	 * 从尾到头打印链表,使用递归(优雅!)
	 */
	public static void reversePrintListRec(Node head) {
		if (head == null) {
			return;
		} else {
			reversePrintListRec(head.next);
			System.out.print(head.val + " ");
		}
	}

	/**
	 * 已知两个单链表pHead1 和pHead2 各自有序,把它们合并成一个链表依然有序
	 * 这个类似归并排序。尤其注意两个链表都为空,和其中一个为空时的情况。只需要O(1)的空间。时间复杂度为O(max(len1, len2))
	 */
	public static Node mergeSortedList(Node head1, Node head2) {
		// 其中一个链表为空的情况,直接返回另一个链表头,O(1)
		if (head1 == null) {
			return head2;
		}
		if (head2 == null) {
			return head1;
		}

		Node mergeHead = null;
		// 先确定下来mergeHead是在哪里
		if (head1.val < head2.val) {
			mergeHead = head1;
			head1 = head1.next; 		// 跳过已经合并了的元素
			mergeHead.next = null; 	// 断开mergeHead和后面的联系
		} else {
			mergeHead = head2;
			head2 = head2.next;
			mergeHead.next = null;
		}

		Node mergeCur = mergeHead;
		while (head1 != null && head2 != null) {
			if (head1.val < head2.val) {
				mergeCur.next = head1; 		 // 把找到较小的元素合并到merge中
				head1 = head1.next;				 // 跳过已经合并了的元素
				mergeCur = mergeCur.next;	 // 找到下一个准备合并的元素
				mergeCur.next = null;			 // 断开mergeCur和后面的联系
			} else {
				mergeCur.next = head2;
				head2 = head2.next;
				mergeCur = mergeCur.next;
				mergeCur.next = null;
			}
		}

		// 合并剩余的元素
		if (head1 != null) {
			mergeCur.next = head1;
		} else if (head2 != null) {
			mergeCur.next = head2;
		}

		return mergeHead;
	}

	/**
	 * 递归合并两链表(优雅!)
	 */
	public static Node mergeSortedListRec(Node head1, Node head2) {
		if (head1 == null) {
			return head2;
		}
		if (head2 == null) {
			return head1;
		}

		Node mergeHead = null;
		if (head1.val < head2.val) {
			mergeHead = head1;
			// 连接已解决的子问题
			mergeHead.next = mergeSortedListRec(head1.next, head2);
		} else {
			mergeHead = head2;
			mergeHead.next = mergeSortedListRec(head1, head2.next);
		}
		return mergeHead;
	}

	/**
	 * 判断一个单链表中是否有环
	 * 这里也是用到两个指针。如果一个链表中有环,也就是说用一个指针去遍历,是永远走不到头的。因此,我们可以用两个指针去遍历,一个指针一次走两步
	 * ,一个指针一次走一步,如果有环,两个指针肯定会在环中相遇。时间复杂度为O(n)
	 */
	public static boolean hasCycle(Node head) {
		Node fast = head; // 快指针每次前进两步
		Node slow = head; // 慢指针每次前进一步

		while (fast != null && fast.next != null) {
			fast = fast.next.next;
			slow = slow.next;
			if (fast == slow) { // 相遇,存在环
				return true;
			}
		}
		return false;
	}

	// 判断两个单链表是否相交
	/**
	 * 如果两个链表相交于某一节点,那么在这个相交节点之后的所有节点都是两个链表所共有的。 也就是说,如果两个链表相交,那么最后一个节点肯定是共有的。
	 * 先遍历第一个链表,记住最后一个节点,然后遍历第二个链表, 到最后一个节点时和第一个链表的最后一个节点做比较,如果相同,则相交,
	 * 否则不相交。时间复杂度为O(len1+len2),因为只需要一个额外指针保存最后一个节点地址, 空间复杂度为O(1)
	 */
	public static boolean isIntersect(Node head1, Node head2) {
		if (head1 == null || head2 == null) {
			return false;
		}

		Node tail1 = head1;
		// 找到链表1的最后一个节点
		while (tail1.next != null) {
			tail1 = tail1.next;
		}

		Node tail2 = head2;
		// 找到链表2的最后一个节点
		while (tail2.next != null) {
			tail2 = tail2.next;
		}

		return tail1 == tail2;
	}

	/**
	 * 求两个单链表相交的第一个节点 对第一个链表遍历,计算长度len1,同时保存最后一个节点的地址。
	 * 对第二个链表遍历,计算长度len2,同时检查最后一个节点是否和第一个链表的最后一个节点相同,若不相同,不相交,结束。
	 * 两个链表均从头节点开始,假设len1大于len2
	 * ,那么将第一个链表先遍历len1-len2个节点,此时两个链表当前节点到第一个相交节点的距离就相等了,然后一起向后遍历,直到两个节点的地址相同。
	 * 时间复杂度,O(len1+len2)
	 * 
	 *    			----    len2
	 *         			 |__________
	 *       			 |
	 *       ---------   len1
	 *       |---|<- len1-len2
	 */
	public static Node getFirstCommonNode(Node head1, Node head2) {
		if (head1 == null || head2 == null) {
			return null;
		}
		int len1 = 1;
		Node tail1 = head1;
		while (tail1.next != null) {
			tail1 = tail1.next;
			len1++;
		}

		int len2 = 1;
		Node tail2 = head2;
		while (tail2.next != null) {
			tail2 = tail2.next;
			len2++;
		}

		// 不相交直接返回NULL
		if (tail1 != tail2) {
			return null;
		}

		Node n1 = head1;
		Node n2 = head2;

		// 略过较长链表多余的部分
		if (len1 > len2) {
			int k = len1 - len2;
			while (k != 0) {
				n1 = n1.next;
				k--;
			}
		} else {
			int k = len2 - len1;
			while (k != 0) {
				n2 = n2.next;
				k--;
			}
		}

		// 一起向后遍历,直到找到交点
		while (n1 != n2) {
			n1 = n1.next;
			n2 = n2.next;
		}

		return n1;
	}

	/**
	 * 求进入环中的第一个节点 用快慢指针做(本题用了Crack the Coding Interview的解法,因为更简洁易懂!)
	 */
	public static Node getFirstNodeInCycle(Node head) {
		Node slow = head;
		Node fast = head;

		// 1) 找到快慢指针相遇点
		while (fast != null && fast.next != null) {
			slow = slow.next;
			fast = fast.next.next;
			if (slow == fast) { // Collision
				break;
			}
		}

		// 错误检查,这是没有环的情况
		if (fast == null || fast.next == null) {
			return null;
		}

		// 2)现在,相遇点离环的开始处的距离等于链表头到环开始处的距离,
		// 这样,我们把慢指针放在链表头,快指针保持在相遇点,然后
		// 同速度前进,再次相遇点就是环的开始处!
		slow = head;
		while (slow != fast) {
			slow = slow.next;
			fast = fast.next;
		}

		// 再次相遇点就是环的开始处
		return fast;
	}

	/**
	 * 求进入环中的第一个节点 用HashMap做 一个无环的链表,它每个结点的地址都是不一样的。
	 * 但如果有环,指针沿着链表移动,那这个指针最终会指向一个已经出现过的地址 以地址为哈希表的键值,每出现一个地址,就将该键值对应的实值置为true。
	 * 那么当某个键值对应的实值已经为true时,说明这个地址之前已经出现过了, 直接返回它就OK了
	 */
	public static Node getFirstNodeInCycleHashMap(Node head) {
		HashMap<Node, Boolean> map = new HashMap<Node, Boolean>();
		while (head != null) {
			if (map.get(head) == true) {
				return head; // 这个地址之前已经出现过了,就是环的开始处
			} else {
				map.put(head, true);
				head = head.next;
			}
		}
		return head;
	}

	/**
	 * 给出一单链表头指针head和一节点指针toBeDeleted,O(1)时间复杂度删除节点tBeDeleted
	 * 对于删除节点,我们普通的思路就是让该节点的前一个节点指向该节点的下一个节点
	 * ,这种情况需要遍历找到该节点的前一个节点,时间复杂度为O(n)。对于链表,
	 * 链表中的每个节点结构都是一样的,所以我们可以把该节点的下一个节点的数据复制到该节点
	 * ,然后删除下一个节点即可。要注意最后一个节点的情况,这个时候只能用常见的方法来操作,先找到前一个节点,但总体的平均时间复杂度还是O(1)
	 */
	public void delete(Node head, Node toDelete){
		if(toDelete == null){
			return;
		}
		if(toDelete.next != null){			// 要删除的是一个中间节点
			toDelete.val = toDelete.next.val;		// 将下一个节点的数据复制到本节点!
			toDelete.next = toDelete.next.next;
		}
		else{		// 要删除的是最后一个节点!
			if(head == toDelete){		// 链表中只有一个节点的情况  
				head = null;
			}else{
				Node node = head;
				while(node.next != toDelete){	// 找到倒数第二个节点
					node = node.next;
				}
				node.next = null;
			}
		}
	}
	
}




谢谢@buding12321 指出的bug~ 已经修复了


保姆级教程:在Windows 10上为QT5.15.2配置Android开发环境(含SDK/NDK/JDK避坑指南) 本文提供了一份详细的Windows 10环境下为QT5.15.2配置Android开发环境的保姆级教程,涵盖SDK、NDK、JDK的安装与配置,以及常见问题的避坑指南。通过优化安装流程、解决Gradle下载慢等痛点,帮助开发者快速搭建稳定的编译环境,并提供了模拟器配置和调试技巧,确保开发效率。 阅读详情

相关推荐

【数字人实战】Windows系统下Fun-CosyVoice3-0.5B-2512本地部署的避坑指南与疑难解析

本文详细介绍了在Windows系统下本地部署Fun-CosyVoice3-0.5B-2512的避坑指南与疑难解析,包括Python环境准备、源码获取、依赖安装、模型下载与WebUI启动等关键步骤。特别针对Windows环境下的常见问题提供了实用解决方案,帮助开发者高效完成部署并充分利用其语音转换与多语言支持功能。

weixin_42521856的博客 375

Java-数据结构-链表-高频面试题(2)

你所厌恶的今天,是昨天死去之人奢望的明天。你所浪费的现在,是未来的你回不去的曾经。时间如此宝贵,作为学生,学习就是我们的职责,那么不要懈怠!让我们开始今天的学习吧!

爱是小小的癌的博客 1482

VINS-Fusion实战:从零搭建无人机视觉惯性导航系统(附ROS配置指南)

本文提供了一份详尽的VINS-Fusion实战指南,涵盖从硬件选型、传感器标定到ROS节点配置与参数调优的全过程。重点解析了如何将VINS-Fusion视觉惯性里程计系统与PX4飞控深度集成,并实现室外GPS融合,旨在帮助开发者从零搭建稳定、高精度的无人机视觉惯性导航系统。

lll78的博客 864

链表经典 10题

链表10 道经典例题

mu_tong_的博客 2896

STM32F407单一定时器输出4路不同频率及占空比的PWM波

STM32F407单一定时器输出4路不同频率及占空比的PWM波

qq_43868701的博客 4918

基于深度学习的文字识别与检测算法研究

基于深度学习的文字识别与检测算法研究 1. 背景介绍 1.1 文字识别与检测的重要性 在当今信息时代,文字作为人类交流和传递信息的主要载体,无处不在。从日常生活中的路牌、广告牌,到办公场所的文件、合同,再到互联网上的网页、图片等

AI天才研究院 1043

Java数据结构与算法——链表面试题

本文为链表相关面试题,每道题均附讲解及对应连接。 一:反转一个单链表。 链接:206. 反转链表 - 力扣(LeetCode)https://leetcode.cn/problems/reverse-linked-list/description/ 1.题目:给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。2. 2.解题 我的思路是:从第二个结点开始,依次将后一个结点的指向改变为指向前一个结点。如果直接改变指向,那么就无法找到下一个结点了,所.....

baijaiyu的博客 1658

你学Simulink--基于储能系统的建模与仿真场景:飞轮储能系统在电网调频中的作用仿真

本文详细介绍了利用Simulink+Simscape搭建飞轮储能系统(FESS)电网调频仿真模型的全过程。主要内容包括:系统工作原理及调频作用分析,基于Simulink的模块化建模步骤(飞轮、电机/发电机、功率电子接口等组件搭建),调频控制策略实现(频率检测、功率指令生成和模式切换),以及仿真参数设置与结果分析方法。该模型可有效模拟FESS在电网频率调节中的快速响应特性,为新能源存储和智能电网研究提供重要仿真工具,同时可通过参数优化和算法改进进一步提升系统性能。

xiaoheshang_123的博客 168

链表题目汇总

序言 努力汇总链表题目,好好干饭,好好努力,好好加油哦 题目一:删掉链表的某一个node 实现一种算法,删除单向链表中间的某个节点(即不是第一个或最后一个节点) 输入:删除单向链表a->b->c->d->e->f中的节点c 结果:不返回任何数据,但该链表变为a->b->d->e->f 链表中的每一个node有两个属性 一个是 val 一个是next表方向 所以想要删掉某特定的node,只要改变这个node的这两个属性,使之变成下一个node的两个属

Jiana_Feng的博客 1177

【忍者算法】从生活案例理解滑动窗口最大值:一个超直观的思路讲解|LeetCode 239 滑动窗口最大值

点此看全部题解更多干货,请关注公众号【忍者算法】,回复【刷题清单】获取完整题解目录~

忍者算法的博客 632

am62x A53与R5F通信

AM62x是Ti的一款异构多核芯片。remoteproc驱动,硬编码(写死)了R5F/M4F固件的名字,这样驱动启动时,就会找硬件编码的固件,下面是其对应关系。值得注意的是,linux内核中的M4F remoteproc驱动启动M4F,而linux内核中的R5F remoreteproc驱动不启动R5F,相反,它attach到已经在boot阶段启动的R5F固件上。在/lib/firmware的真实固件名:,而我们生成的固件名如下所示,没有直接对应的,经确认,.out文件就是我们需要的,重命名后即可。

鹰之翔 1358

链表经典练习题

本篇文章到这里就结束了,如果有不理解的题目,可私信或在评论区留下问题,记得一定要练习,这是非常重要的。再强调:大部分题目解法只为了抛砖引玉。希望对大家有所启发。完!

2302_81016149的博客 1468

SMMU软件指南SMMU编程之流表(Stream Table)

SMMU使用一组内存中的数据结构来定位翻译数据,详见“转换过程概述”(Translation process overview)。SMMU_(*_)STRTAB_BASE 存储初始结构(流表,Stream Table)的基地址。流表项(Stream Table Entry, STE)包含二级(Stage 2)转换表的基址指针,同时也定位一级(Stage 1)配置结构,这些配置结构包含转换表的基址指针。 传入事务的 StreamID,由 SEC_SID 进行限定,决定了用于查找的流表,并定位相应的STE。

AI-安全-功耗 1189

java面试手写单链表_(转)面试大总结之一:Java搞定面试中的链表题目

packageLinkedListSummary;importjava.util.HashMap;importjava.util.Stack;/***http://blog.youkuaiyun.com/luckyxiaoqiang/article/details/7393134轻松搞定面试中的链表题目*http://www.cnblogs.com/jax/archive/2009/12/11/1621...

weixin_32868705的博客 188

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

(转)面试大总结之一:Java搞定面试中的链表题目

面试大总结之一:Java搞定面试中的链表题目 分类: Algorithm Interview2013-11-16 05:53 11628人阅读 评论(40) 收藏 举报 链表是面试中常出现的一类题目,本文用Java实现了面试中常见的链表相关题目。本文主要参考整合重写了《轻松搞定面试中的链表题目》和 《算法大全(1)单链表》两篇大作。两篇大神的实现分别是C和C#,因为我更喜欢用Jav...

weixin_34268310的博客 88

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Java搞定面试中的链表题目

这是本系列的第二篇,与前一篇 面试大总结之一:Java搞定面试中的链表题目 相比,二叉树的题目可以变化的就更多了。本文还是参考整合重写了《轻松搞定面试中的二叉树题目》和《算法大全(3) 二叉树》两篇大作。本文一个小亮点就是几乎每一道题都用了递归和迭代两种方法写过一遍,因为面试时往往可能会被要求写不擅长的那一种。这一千多行的记录也是我在面试摸索过程中的一个小笔记,备份与此。请大神们轻拍指正。今后

编程爱好者 911

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

java 链表_一篇文章搞定程序员面试中的链表题目(java实现),记得收藏!

前言最近总结了一下数据结构和算法的题目,关于链表的, 废话少说,上链表的数据结构class ListNode { ListNode next; int val; ListNode(int x){ val = x; next = null; }}1.翻转链表文末有面试资料领取2.判断链表是否有环 boolean hasCycle(ListNode head){ if(head == null|| h...

weixin_39859988的博客 107

一篇文章搞定面试中的链表题目(java实现)

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34162629的博客 121

java链表算法面试题_一篇文章搞定面试中的链表题目(java实现)

最近总结了一下数据结构和算法的题目,这是第二篇文章,关于链表的,第一篇文章关于二叉树的参见废话少说,上链表的数据结构class ListNode {ListNode next;int val;ListNode(int x){val = x;next = null;}}1.翻转链表ListNode reverse(ListNode node){ListNode prev = null;while(n...

weixin_30989583的博客 300

面试总结:用Java搞定面试中的链表题目

package org.hunan.guan.javaIO; import java.util.HashMap; import java.util.Stack; /** * http://blog.youkuaiyun.com/luckyxiaoqiang/article/details/7393134 轻松搞定面试中的链表题目 * http://www.cnblogs.com/jax/archive

zhongwen7710的专栏 1182

java 树 面试题_面试大总结之二:Java搞定面试中的二叉树题目

这是本系列的第二篇,与前一篇面试大总结之一:Java搞定面试中的链表题目相比,二叉树的题目可以变化的就更多了。本文还是参考整合重写了《轻松搞定面试中的二叉树题目》和《算法大全(3)二叉树》两篇大作。本文一个小亮点就是几乎每一道题都用了递归和迭代两种方法写过一遍,因为面试时往往可能会被要求写不擅长的那一种。这一千多行的记录也是我在面试摸索过程中的一个小笔记,备份与此。请大神们轻拍指正。今后我也会...

weixin_33096511的博客 256

Java面试-轻松搞定Java面试集合相关题目

集合是Java面试必考的高频知识点,虽然大家平时多少都会在用,但是对这个体系和底层实现很少有较全面的认知。 本文参考了《极客时间-Java核心技术36讲》和《牛客网-Java开发岗高频面试题全解析》,在较为系统的复习之后总结于此。希望对同样的正在准备找工作的同学有所帮助 关于Java中的集合类,你知道多少呢? 首先,放上一张整体分类图,从图中可以看出,Java的集合类起源于两个接口,一个是Map,...

clonechen 7657

面试大总结:Java搞定面试中的二叉树题目

转载自:http://blog.youkuaiyun.com/fightforyourdream/article/details/16843303 这是本系列的第二篇,与前一篇 面试大总结之一:Java搞定面试中的链表题目 相比,二叉树的题目可以变化的就更多了。本文还是参考整合重写了《轻松搞定面试中的二叉树题目》和《算法大全(3) 二叉树》两篇大作。本文一个小亮点就是几乎每一道题都用了递归和迭代两种方法

帅性而为1号的博客 532
上一篇: 面试:称硬币找假币的问题
下一篇: JavaScript中的call和apply小结
chiiis
博客等级 码龄14年 422粉丝 429原创
评论 36
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值