------------【算法题目】
你是我世界的光
不念过往,不畏将来。
展开
-
关于一个集合的子集的思考
之前做过很多类似的题目,比如说给你一个字符串ABC,然后请给出他的子集(A,B,C,AB,AC,BC,ABC),差不多都是这样的,当然也有给你ABC,请给出跟其长度一样的组合(ABC,ACB,BAC,BCA,CAB,CBA)等等。由于这种题目都是涉及到排列组合数学,因此这里来总结一下。1.首先我们来讨论第一种情况,即给出一个集合,求出其子集。从数学角度,我们可以知道,拥有n个元素的集合,它拥有2n原创 2016-08-26 23:24:44 · 1262 阅读 · 0 评论 -
某公司测试题(一)--奇数节点移动到偶数节点之前
题目:1将链表中的所有元素为奇数的节点移到元素为偶数节点的前面,并保证奇数之间顺序不变,偶数之间顺序不变。示例: 交换前链表的顺序 交换后链表的顺序 4→5→3→1→2 ==> 5→3→1→4→2 1 ==> 1 (链表仅含一个元素) 2→1 ==>1→2 ==> (链表为空)C/C++: 链表节点定义为: struct node原创 2016-08-24 11:05:34 · 1283 阅读 · 0 评论 -
简单字符串的压缩
代码如下:import java.util.*;public class Zipper { public String zipString(String iniString) { // write code here StringBuilder sb = new StringBuilder(); int count=1; sb.原创 2016-08-24 11:01:48 · 449 阅读 · 0 评论 -
质数因子
代码:辗转相除即可。import java.util.*;public class Main{ public static boolean judge(long value){ for(long i = 1;i<=value;i++){ if(value%i==0&&value!=i&&i!=1){ return fals原创 2016-08-23 12:24:07 · 318 阅读 · 0 评论 -
硬币表示
思路:先用1表示的初始化一遍,再用5表示的继续在原来基础上继续初始化…代码:import java.util.*;public class Coins { public int countWays(int n) { // write code here int[] coins={1,5,10,25}; int[] dp = new int[100原创 2016-08-22 12:30:14 · 350 阅读 · 0 评论 -
洪水(使用BFS)
思路分析:使用BFS对一个节点四周可以通行的节点进行初始化。因为无论是已经遍历过的节点,还是有障碍的节点,其值都不可能是0,因此我们用0来做判断标准。代码及注释如下:import java.util.*;//使用BFS来解决public class Flood { public int floodFill(int[][] map, int n, int m) { // wr原创 2016-08-22 11:38:07 · 436 阅读 · 0 评论 -
括号序列合法性检查
思路:入栈,入栈时如果空栈那么直接入栈,否则检查栈顶和下一个字符是否匹配,匹配则出栈,否则继续入栈。AC代码:import java.util.*;public class Parenthesis { public boolean chkParenthesis(String A, int n) { // write code here Stack<Charac原创 2016-08-21 22:50:42 · 1796 阅读 · 0 评论 -
字符串组合数目的统计
分析:提取首字母,然后对首字母后面的字符进行递归操作即可。我的代码:import java.util.*;public class Permutation { public ArrayList<String> getPermutation(String A) { // write code here if(A==null){ retur原创 2016-08-21 22:17:03 · 589 阅读 · 0 评论 -
魔术数二
思路跟魔术数一差不多,但是递归搜索的范围变化了。可以在直角坐标系中划出直线根据斜率思考。import java.util.*;public class MagicIndex { public boolean findMagicIndex(int[] A, int n) { // write code here if(find(A,0,n-1)!=-1)原创 2016-08-21 20:00:29 · 392 阅读 · 0 评论 -
某公司测试题(二)---完全平方数最少
题目:给一个正整数 n, 找到若干个完全平方数(比如1, 4, 9, … )使得他们的和等于 n。你需要让平方数的个数最少。 给出 n = 12, 返回 3 因为 12 = 4 + 4 + 4。 给出 n = 13, 返回 2 因为 13 = 4 + 9。动态规划的思路,代码及注释如下:package tuyamobile;import java.util.ArrayList;import j原创 2016-08-24 11:07:01 · 1783 阅读 · 0 评论 -
实现字符串的反转
题目如下:分析:反转整个句子,然后以空格为标志,反转每个单词即可代码如下:import java.util.*;public class Main{ public static void main(String[] args){ Scanner sc = new Scanner(System.in); String sen = sc.nextLine();原创 2016-09-03 20:17:33 · 317 阅读 · 0 评论 -
合并表记录(华为机试题)
注意事项:要用TreeMap而不是HashMap,因为前者有序。我的代码:import java.util.*;public class Main{ public static void main(String[] args){ Scanner sc = new Scanner(System.in); Map<Integer,Integer> map = new原创 2016-08-24 21:09:50 · 662 阅读 · 0 评论 -
判断小数能否用32位二进制精确的表示
本文代码可在我的github中BinDecimal.java中找到。题目描述:有一个介于0和1之间的实数,类型为double,返回它的二进制表示。如果该数字无法精确地用32位以内的二进制表示,返回“Error”。 给定一个double num,表示0到1的实数,请返回一个string,代表该数的二进制表示或者“Error”。思路分析:一位一位的判断,判断一位去掉一位。并且另起一个字符串进行表示。代原创 2016-08-15 13:24:23 · 1425 阅读 · 0 评论 -
二叉树---二叉树平衡性的检查
本文涉及到的代码在我的github中的Balance.java中。 题目描述:实现一个函数,检查二叉树是否平衡,平衡的定义如下,对于树中的任意一个结点,其两颗子树的高度差不超过1。给定指向树根结点的指针TreeNode* root,请返回一个bool,代表这棵树是否平衡。思路分析:求得左子树深度和右子树深度,如果差别大于1,那么返回false,否则对左右子树分别递归判断。代码如下:package原创 2016-08-15 12:36:42 · 449 阅读 · 0 评论 -
二叉树---建立高度最小的二叉树
本文涉及到的代码可以在我的github中找到。 题目描述:对于一个元素各不相同且按升序排列的有序序列,请编写一个算法,创建一棵高度最小的二叉查找树。 给定一个有序序列int[] vals,请返回创建的二叉查找树的高度。分析:这里题目只是要求返回二叉树的高度,虽然我们可以用公式直接算出来,不过我们是出于练习的目的,因此我们这里也建个树。首先使用公式计算的方法的一种代码:package newcod原创 2016-08-15 11:27:07 · 3042 阅读 · 2 评论 -
约瑟夫环的基本问题
import java.util.*;public class Joseph { public int getResult(int n, int m) { // write code here ArrayList<Integer> list = new ArrayList<>(); for(int i = 0;i<n;i++){原创 2016-08-26 16:20:30 · 397 阅读 · 0 评论 -
二叉树---检查是否为BST
今天开始为校招做准备。本文的实现代码可以在我的github中找到。题目来自牛客网:请实现一个函数,检查一棵二叉树是否为二叉查找树。给定树的根结点指针TreeNode* root,请返回一个bool,代表该树是否为二叉查找树。分析思路:只要节点的值大于左子节点和左子节点的右子节点,小于右子节点和右子节点的左子节点即可。这样用递归很容易实现。代码:import java.util.*;/*public原创 2016-08-14 23:55:28 · 1218 阅读 · 1 评论 -
堆箱子
思路分析:用一个f数组中的f[i]来储存前i个箱子所能到达的最大高度。还是动态规划的思路。代码如下:class Box { int f[501] = {0}; //存放n个箱子的最大上升高度public: int getHeight(vector<int> w, vector<int> l, vector<int> h, int n) { for(int i = w原创 2016-08-25 20:03:57 · 1286 阅读 · 0 评论 -
n皇后问题
程序思路结构分析:在第一行第一个位置放置一个皇后,然后在下一行放置一个皇后,判断是否冲突,如果冲突就将刚刚放置的皇后再次后移放置,直到没有冲突,然后递归调用放置。import java.util.*;public class Queens { public int nQueens(int n) { // write code here int[] res =原创 2016-08-25 12:29:36 · 290 阅读 · 0 评论 -
提取不重复的整数
我的代码:import java.util.*;public class Main{ public static void main(String[] args){ Scanner sc = new Scanner(System.in); while(sc.hasNext()){ int st = sc.nextInt();原创 2016-08-24 22:26:24 · 242 阅读 · 0 评论 -
魔术数的索引一
思路:类似于二分查找,import java.util.*;public class MagicIndex { public boolean findMagicIndex(int[] A, int n) { // write code here if(findOne(A,0,n-1)!=-1) return true;原创 2016-08-21 13:41:48 · 671 阅读 · 0 评论 -
机器人走方格二---(有障碍的方格)
思路分析:还是动态规划,不过需要同时判断map数组的状态,然后依照状态进行不同的操作。import java.util.*;public class Robot { public int countWays(int[][] map, int x, int y) { // write code here int[][] res = new int[x][y];原创 2016-08-21 12:16:15 · 2306 阅读 · 0 评论 -
int数据的奇偶位交换
分析:利用位运算。代码如下:import java.util.*;public class Exchange { public int exchangeOddEven(int x) { // write code here int odd = x&0x55555555; int even = x&0xaaaaaaaa; retur原创 2016-08-16 12:20:24 · 418 阅读 · 0 评论 -
有向路径检查
题目描述对于一个有向图,请实现一个算法,找出两点之间是否存在一条路径。给定图中的两个结点的指针UndirectedGraphNode* a,UndirectedGraphNode* b(请不要在意数据类型,图是有向图),请返回一个bool,代表两点之间是否存在一条路径(a到b或b到a)。分析:涉及到图的遍历。这里用的是广度优先遍历(BFS).图的每个单元节点有一个邻接表,因此我们这里用一个map来存原创 2016-08-16 12:17:48 · 396 阅读 · 0 评论 -
猫狗收容所
思路分析:就是按照要求顺序写下来就好。下面是我AC的代码:package newcoder;import java.util.*;public class CatDogAsylum{ public ArrayList<Integer> asylum(int[][] ope) { // write code here ArrayList<int[]>原创 2016-08-15 20:03:38 · 350 阅读 · 0 评论 -
用2个栈实现队列
题目描述:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。分析:以栈A为基准,入队列全部入A,出队列的时候,将A中的数据依次出栈并且放入B,然后从B出队列,出完队列之后,再将B中的数据出栈并入A。代码:import java.util.Stack;public class Solution { Stack<Integer> stack1 = new Sta原创 2016-08-15 18:52:06 · 221 阅读 · 0 评论 -
得到二叉树指定层的所有结点
题目来自于牛客网:题目描述: 对于一棵二叉树,请设计一个算法,创建含有某一深度上所有结点的链表。 给定二叉树的根结点指针TreeNode* root,以及链表上结点的深度,请返回一个链表ListNode,代表该深度上所有结点的值,请按树上从左往右的顺序链接,保证深度不超过树的高度,树上结点的值为非负整数且不超过100000。解答程序:import java.util.*;/*publi原创 2016-06-28 00:20:14 · 1738 阅读 · 0 评论 -
JAVA实现字符表达式的计算的实现(一)--逆波兰式的实现
写了2天,终于写出了个结果。逆波兰式:可自行移步度娘http://baike.baidu.com/link?url=RWADssWBHn8SmI6A_DEuFXhwMLfCKtwG-RdP1PTIW1k5kFX0ZD4fI1_GRfXGMwy6FJwYPphMEDYyj2mCJzKaBa程序如下:下面的程序中,有封装好的实现字符串转换成逆波兰式的方法。package biaodashi原创 2016-03-29 22:35:01 · 1885 阅读 · 0 评论 -
字符互异问题
题目源自牛客网的一个练习题:请实现一个算法,确定一个字符串的所有字符是否全都不同。这里我们要求不允许使用额外的存储结构。给定一个string iniString,请返回一个bool值,True代表所有字符全都不同,False代表存在相同的字符。保证字符串中的字符为ASCII字符。字符串的长度小于等于3000。测试样例:"aeiou"返回:True"BarackObama原创 2016-05-01 00:55:14 · 409 阅读 · 0 评论 -
寻找下一个结点
题目来自牛客网: 请设计一个算法,寻找二叉树中指定结点的下一个结点(即中序遍历的后继)。给定树的根结点指针TreeNode* root和结点的值int p,请返回值为p的结点的后继结点的值。保证结点的值大于等于零小于等于100000且没有重复值,若不存在后继返回-1。 其实考察了一下树的遍历算法而已。下面给出示例代码:import java.util.*;/*原创 2016-05-22 11:43:16 · 446 阅读 · 0 评论 -
位操作算法的总结(一)
本文参考《程序员面试金典》1.位操作原理与技巧第一组:-x^000..000 = x ; - x^111..111 = ~x; - x^x = 0;第二组:x&000..000 = 0;x&111..111 = x;x&x = x;第三组:x|000..000 = x;x|111..111 = 111..111;x|x = x;理解上述三组原理的含义,我们需要记住所有操作都是按位原创 2016-08-16 22:47:07 · 2411 阅读 · 0 评论 -
寻找缺少的整数
分析:数组number里面是有序的,即从0-n都是按照从小到大的顺序排列的。那么肯定他的坐标和坐标处的值是相等的,当然也是同奇偶的。利用这点,第一个不同奇偶的值的坐标肯定是缺少的数。代码:import java.util.*;public class Finder { public int findMissing(int[][] numbers, int n) { // wr原创 2016-08-17 11:30:47 · 373 阅读 · 0 评论 -
像素设定
分析:从题意我们可以知道,数组中的每个值的范围为0-255,即8位二进制表示的一个十进制数,对于x-y范围的数目,显然我们可以一位一位的进行“涂色”,涂色需要知道该位的位置,因此我们需要先确定他在数组的哪一组元素上,然后在该组元素中寻找详细的位置。代码如下:import java.util.*;public class Render { public int[] renderPixel(in原创 2016-08-17 11:58:46 · 262 阅读 · 0 评论 -
机器人移动问题
这还是一个动态规划问题,可以使用递归或者使用数组储存中间过程结果的方法来编程。代码一使用递归的方法,这样没有申请额外的存储空间,执行效率低一些:import java.util.*;public class Robot { public int countWays(int x, int y) { // write code here if(x<=0||y<=0原创 2016-08-21 11:49:16 · 1279 阅读 · 1 评论 -
上楼梯
这是一个动态规划的问题。思路分析:以最后剩下台阶的个数分类。另外,使用一个数组来缓存前面的结果。代码:import java.util.*;public class GoUpstairs { public int countWays(int n) { // write code here int[] a = new int[100000]; a原创 2016-08-19 16:22:48 · 358 阅读 · 0 评论 -
第k个数
这个题目很值得研究。下面是代码:import java.util.*;public class KthNumber { public int findKth(int k) { // write code here if(k<0) return 0; int val = 0; Queue<Integer> q原创 2016-08-17 22:33:26 · 396 阅读 · 0 评论 -
蚂蚁碰撞概率计算
题目分析,无论是几只蚂蚁,因为每个蚂蚁占据一个顶点,因此不发生碰撞的情况只有2种,即全部都顺时针爬行或者逆时针爬行。所以只要求出一共爬行的情况就好,而显然有2n 2^n 种情况。第一次提交的代码如下:import java.util.*;public class Ants { public double antsCollision(int n) { // write cod原创 2016-08-17 12:21:47 · 918 阅读 · 0 评论 -
约瑟夫环二
思路都在注释中。import java.util.*;public class Joseph { public int getResult(int n) { // write code here LinkedList<Integer> list = new LinkedList<Integer>(); for(int i = 0;i<n;i+原创 2016-08-27 20:24:56 · 464 阅读 · 0 评论 -
穿点最多的直线
思路分析:每2个点计算斜率和截距并包装成为一个对象,加入map,统计个数,最后找出最高的。代码如下:import java.util.*;/*public class Point { int x; int y; public Point(int x, int y) { this.x = x; this.y = y; } pub原创 2016-08-17 20:03:41 · 439 阅读 · 0 评论 -
平分的直线
分析:只需要定出2个正方形的中点左边,然后就可以确定出这条直线。代码如下:import java.util.*;/*public class Point { int x; int y; public Point(int x, int y) { this.x = x; this.y = y; } public Point() {原创 2016-08-17 14:58:58 · 474 阅读 · 0 评论