Description: 有2n个硬币和一个天平,其中有一个质量是m+1, 另一个硬币质量为m-1, 其余的硬币质量都是m. 要求:O(lgn)时间找出两枚假币 注意: n不一定是2的幂次方 算法1:O(n)算法 将2n个硬币分成n组(每组2个)进行称量: 结果只有两种: 1. 仅有一组出现天平不平衡: 一定就是 两个假币 2. 出现两组天平不平衡: 这四个硬币中必定存在两个假币.将重的硬币称量,轻的两个硬币称量得到结果. 算法2: O(lgn)算法 分治 首先假设n是2的幂次方(如果不是,则可…
出题:给定链表的头指针和一个节点指针,要求在O(1)的时间复杂度下删除该节点 分析: 如果需要删除的节点为A,其前序节点为A-,其后续节点为A+,所以删除A之后,需要使得A-的下一个节点就是A+,常规做法是设法得到A-的索引,需要 从链表头开始遍历所以时间复杂度为O(N),但实际情况是只要保证A-的下一个节点是A+就行: 所以可将A+节点的内容直接复制到A节点,这时时间复杂度 为O(1),对于最后一个节点而言需要使用O(N)的时间复杂度,所以平均复杂度为(O(1)*(n-1) + O(n))/n…
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.RegularExpressions; namespace ConsoleApplication1 { class CompareArr { static void Main(string[] args) { try { int[] srcArr1 = new int[] { 2, 5, 6…
思路分析:任何一个数字异或它自己都等于0,根据这一特性,如果从头到尾依次异或数组中的每一个数字,因为那些出现两次的数字全部在异或中抵消掉了,所以最终的结果刚好是那些只出现一次的数字. 代码如下: #include "stdafx.h" #include <stdio.h> int findNotDouble(int a[], int n) { ]; int i; ; i < n; ++i) result ^= a[i]; return result; } int ma…
核心提示:这是网上开源编程学习项目FCC的javascript中级编程题(Intermediate Algorithm Scripting(50 hours)),一共20题.建议时间是50个小时,对于刚入门的人来说,操作是有些难度了. #### 1.我们会传递给你一个包含两个数字的数组.返回这两个数字和它们之间所有数字的和. 最小的数字并非总在最前面. 简单地说,就是两个数之间的连续自然数列求和问题.项数可以用Math.abs()方法求出. function sumAll(arr) { var…
一.线性表,如数组,单链表,双向链表 线性表.数组 U1.有序数组去重,返回新数组长度 A = [1,1,2] -> [1,2] 返回2   分析:其实一般数组的问题都可以用两个指针解决,一个指针用于指向新数组,一个用于操作就数组的指针. 解:              112移动后变成122 U2.有序数组去重II,返回数组长度 A = [1,1,1,2,2,3] -> [1,1,2,2,3]  允许每个数字最多出现两次 分析:以间隔2找寻下一个需要移动的元素 解:            …
这是悦乐书的第205次更新,第216篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第72题(顺位题号是342).给定一个整数(带符号的32位),写一个函数来检查它是否为4的幂.例如: 输入:16 输出:true 输入:5 输出:false 跟进:你可以在没有循环/递归的情况下解决它吗? 本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试. 02 第一种解法 特殊情况:当num小于等于1时,直接返回…
这是悦乐书的第204次更新,第215篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第71题(顺位题号是326).给定一个整数,写一个函数来确定它是否为3的幂.例如: 输入:27 输出:true 输入:0 输出:false 输入:9 输出:true 输入:45 输出:false 跟进:你可以不使用任何循环/递归吗? 本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试. 02 第一种解法 新建一个变量…
FCC中的javascript中级算法题解答 中级算法的题目中用到了很多js的知识点,比如迭代,闭包,以及对json数据的使用等等,现在将自己中级算法的解答思路整理出来供大家参考讨论.欢迎大家提出新的思路,写出更简单的解法. 1.给一个包含两个数字的数组.返回这两个数字和它们之间所有数字的和. 说明:最小的数字并非总在最前面 如:sumAll([4, 1]) 应该返回 10. sumAll([5, 10]) 应该返回 45. function sumAll(arr) { var max=Math…
输入两个链表,找出它们的第一个公共结点 1.两个单链表,有公共结点,那么必然,尾部公用 2.找出链表1的长度,找出链表2的长度,长的链表减去短的链表得出一个n值 3.长的链表先走n步,两个链表再同时移动 4.两个链表相交点就是第一个公共结点 list1 list2 len1 len2 if len1 > len2 n=len1-len2 for i=0;i<n;i++ list1=list1->next else n=len2-len1 for i=0;i<n;i++ list2=…