`
chriszeng87
  • 浏览: 738834 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

几道算法题

阅读更多
1. 在一个图里面给一个点,每个点都有颜色,要求给出与这个点相同着色且相邻的最大区域,写算法实现
2.给定一个序列如{A,B,C,D},先序关系,如<A,B>(A先于B),<C,D>,<D,A>,要求按先序关系给出整个序列的顺序,如<A,B>,<C,D>,<D,A>的顺序为C,D,A,B,
3.求证一个链表里是否有环
4.二维的空间中有很多点,要求求出所有点中最近的一对点,时间复杂度要好。
多做算法题,topcoder,pojonline,研究设计模式,msdn,底层和高层都要兼顾到
今天被bs的不行了,加油,Chris
分享到:
评论
22 楼 thihy 2010-12-30  
基本上都见过。所以多面试&多看面试题还是有好处的。
21 楼 chriszeng87 2010-12-22  
izhangh 写道
chriszeng87 写道
izhangh 写道
class Question {

    /**
     * 标记该点是否遍历过,遍历过的值为1
     */
    private static int[][] flgs;

    /**
     * 
     * @param values
     *        二维数组,表示各点对应颜色值
     * @param x
     *        需比较点坐标
     * @param y
     *        点比较坐标
     * @return 与values[x][y]值相等且相邻点出现的次数
     */
    public static int run(int[][] values, int x, int y) {
        flgs = new int[values.length][values[0].length];
        Count count = new Count();
        research(values, values[x][y], count, x, y);
        return count.getCount();
    }
    /**
     * 
     * @param values二维数组
     *        ,表示各点对应颜色值
     * @param desValue比较的颜色值
     * @param count出现次数
     * @param x
     *        点坐标
     * @param y
     *        点坐标
     */
    private static void research(int[][] values, int desValue, Count count, int x, int y) {
        // 该点未遍历过,且颜色相同,继续遍历
        if (flgs[x][y] != 1 && values[x][y] == desValue) {

            // 标记该点遍历过
            flgs[x][y] = 1;
            // 计数器加一
            count.addOne();

            // 向左遍历
            if (x > 0) {
                research(values, desValue, count, x - 1, y);
            }
            // 向上遍历
            if (y > 0) {
                research(values, desValue, count, x, y - 1);
            }
            // 向右遍历
            if (x < values.length - 1) {
                research(values, desValue, count, x + 1, y);
            }
            // 向下遍历
            if (y < values[0].length - 1) {
                research(values, desValue, count, x, y + 1);
            }
        }
    }
}


public class Count {
    private int count;

    public void addOne() {
        count++;
    }
    public int getCount() {
        return count;
    }
}

class Test3Main {
    private static int[][] points = new int[][] {
            {
                    1, 1, 1, 1, 1, 1, 1, 1, 1, 1
            }, {
                    1, 1, 1, 1, 0, 1, 1, 1, 1, 1
            }, {
                    1, 1, 1, 1, 1, 0, 0, 1, 1, 1
            }, {
                    1, 1, 0, 0, 0, 1, 1, 1, 1, 1
            }, {
                    1, 1, 0, 0, 0, 1, 1, 1, 1, 1
            }, {
                    1, 1, 1, 1, 0, 0, 1, 1, 1, 1
            }, {
                    1, 1, 1, 1, 1, 0, 1, 1, 1, 1
            }, {
                    1, 1, 1, 1, 1, 0, 0, 0, 1, 1
            }, {
                    1, 1, 1, 1, 1, 1, 1, 0, 1, 1
            }, {
                    1, 1, 1, 1, 1, 1, 1, 1, 1, 1
            },
    };
    public static void main(String[] args) {
         System.out.println(Question.run(points, 4, 3));
    }
}


得到出现次数了,再算面积就简单了吧!

感觉这样做确实可以,不过觉得是不是还有非递归、时间复杂度更好的算法


时间复杂度已经是最小了,你仔细看下吧!它遍历的只是颜色相同的次数+包围该颜色相邻颜色的次数。

额,请教下,包围该颜色相邻颜色的次数,这句话啥意思的
20 楼 izhangh 2010-12-22  
chriszeng87 写道
izhangh 写道
class Question {

    /**
     * 标记该点是否遍历过,遍历过的值为1
     */
    private static int[][] flgs;

    /**
     * 
     * @param values
     *        二维数组,表示各点对应颜色值
     * @param x
     *        需比较点坐标
     * @param y
     *        点比较坐标
     * @return 与values[x][y]值相等且相邻点出现的次数
     */
    public static int run(int[][] values, int x, int y) {
        flgs = new int[values.length][values[0].length];
        Count count = new Count();
        research(values, values[x][y], count, x, y);
        return count.getCount();
    }
    /**
     * 
     * @param values二维数组
     *        ,表示各点对应颜色值
     * @param desValue比较的颜色值
     * @param count出现次数
     * @param x
     *        点坐标
     * @param y
     *        点坐标
     */
    private static void research(int[][] values, int desValue, Count count, int x, int y) {
        // 该点未遍历过,且颜色相同,继续遍历
        if (flgs[x][y] != 1 && values[x][y] == desValue) {

            // 标记该点遍历过
            flgs[x][y] = 1;
            // 计数器加一
            count.addOne();

            // 向左遍历
            if (x > 0) {
                research(values, desValue, count, x - 1, y);
            }
            // 向上遍历
            if (y > 0) {
                research(values, desValue, count, x, y - 1);
            }
            // 向右遍历
            if (x < values.length - 1) {
                research(values, desValue, count, x + 1, y);
            }
            // 向下遍历
            if (y < values[0].length - 1) {
                research(values, desValue, count, x, y + 1);
            }
        }
    }
}


public class Count {
    private int count;

    public void addOne() {
        count++;
    }
    public int getCount() {
        return count;
    }
}

class Test3Main {
    private static int[][] points = new int[][] {
            {
                    1, 1, 1, 1, 1, 1, 1, 1, 1, 1
            }, {
                    1, 1, 1, 1, 0, 1, 1, 1, 1, 1
            }, {
                    1, 1, 1, 1, 1, 0, 0, 1, 1, 1
            }, {
                    1, 1, 0, 0, 0, 1, 1, 1, 1, 1
            }, {
                    1, 1, 0, 0, 0, 1, 1, 1, 1, 1
            }, {
                    1, 1, 1, 1, 0, 0, 1, 1, 1, 1
            }, {
                    1, 1, 1, 1, 1, 0, 1, 1, 1, 1
            }, {
                    1, 1, 1, 1, 1, 0, 0, 0, 1, 1
            }, {
                    1, 1, 1, 1, 1, 1, 1, 0, 1, 1
            }, {
                    1, 1, 1, 1, 1, 1, 1, 1, 1, 1
            },
    };
    public static void main(String[] args) {
         System.out.println(Question.run(points, 4, 3));
    }
}


得到出现次数了,再算面积就简单了吧!

感觉这样做确实可以,不过觉得是不是还有非递归、时间复杂度更好的算法


时间复杂度已经是最小了,你仔细看下吧!它遍历的只是颜色相同的次数+包围该颜色相邻颜色的次数。
19 楼 chriszeng87 2010-12-22  
izhangh 写道
class Question {

    /**
     * 标记该点是否遍历过,遍历过的值为1
     */
    private static int[][] flgs;

    /**
     * 
     * @param values
     *        二维数组,表示各点对应颜色值
     * @param x
     *        需比较点坐标
     * @param y
     *        点比较坐标
     * @return 与values[x][y]值相等且相邻点出现的次数
     */
    public static int run(int[][] values, int x, int y) {
        flgs = new int[values.length][values[0].length];
        Count count = new Count();
        research(values, values[x][y], count, x, y);
        return count.getCount();
    }
    /**
     * 
     * @param values二维数组
     *        ,表示各点对应颜色值
     * @param desValue比较的颜色值
     * @param count出现次数
     * @param x
     *        点坐标
     * @param y
     *        点坐标
     */
    private static void research(int[][] values, int desValue, Count count, int x, int y) {
        // 该点未遍历过,且颜色相同,继续遍历
        if (flgs[x][y] != 1 && values[x][y] == desValue) {

            // 标记该点遍历过
            flgs[x][y] = 1;
            // 计数器加一
            count.addOne();

            // 向左遍历
            if (x > 0) {
                research(values, desValue, count, x - 1, y);
            }
            // 向上遍历
            if (y > 0) {
                research(values, desValue, count, x, y - 1);
            }
            // 向右遍历
            if (x < values.length - 1) {
                research(values, desValue, count, x + 1, y);
            }
            // 向下遍历
            if (y < values[0].length - 1) {
                research(values, desValue, count, x, y + 1);
            }
        }
    }
}


public class Count {
    private int count;

    public void addOne() {
        count++;
    }
    public int getCount() {
        return count;
    }
}

class Test3Main {
    private static int[][] points = new int[][] {
            {
                    1, 1, 1, 1, 1, 1, 1, 1, 1, 1
            }, {
                    1, 1, 1, 1, 0, 1, 1, 1, 1, 1
            }, {
                    1, 1, 1, 1, 1, 0, 0, 1, 1, 1
            }, {
                    1, 1, 0, 0, 0, 1, 1, 1, 1, 1
            }, {
                    1, 1, 0, 0, 0, 1, 1, 1, 1, 1
            }, {
                    1, 1, 1, 1, 0, 0, 1, 1, 1, 1
            }, {
                    1, 1, 1, 1, 1, 0, 1, 1, 1, 1
            }, {
                    1, 1, 1, 1, 1, 0, 0, 0, 1, 1
            }, {
                    1, 1, 1, 1, 1, 1, 1, 0, 1, 1
            }, {
                    1, 1, 1, 1, 1, 1, 1, 1, 1, 1
            },
    };
    public static void main(String[] args) {
         System.out.println(Question.run(points, 4, 3));
    }
}


得到出现次数了,再算面积就简单了吧!

感觉这样做确实可以,不过觉得是不是还有非递归、时间复杂度更好的算法
18 楼 izhangh 2010-12-22  
上面是第一问的答案,请多多讨论。
17 楼 izhangh 2010-12-22  
class Question {

    /**
     * 标记该点是否遍历过,遍历过的值为1
     */
    private static int[][] flgs;

    /**
     * 
     * @param values
     *        二维数组,表示各点对应颜色值
     * @param x
     *        需比较点坐标
     * @param y
     *        点比较坐标
     * @return 与values[x][y]值相等且相邻点出现的次数
     */
    public static int run(int[][] values, int x, int y) {
        flgs = new int[values.length][values[0].length];
        Count count = new Count();
        research(values, values[x][y], count, x, y);
        return count.getCount();
    }
    /**
     * 
     * @param values二维数组
     *        ,表示各点对应颜色值
     * @param desValue比较的颜色值
     * @param count出现次数
     * @param x
     *        点坐标
     * @param y
     *        点坐标
     */
    private static void research(int[][] values, int desValue, Count count, int x, int y) {
        // 该点未遍历过,且颜色相同,继续遍历
        if (flgs[x][y] != 1 && values[x][y] == desValue) {

            // 标记该点遍历过
            flgs[x][y] = 1;
            // 计数器加一
            count.addOne();

            // 向左遍历
            if (x > 0) {
                research(values, desValue, count, x - 1, y);
            }
            // 向上遍历
            if (y > 0) {
                research(values, desValue, count, x, y - 1);
            }
            // 向右遍历
            if (x < values.length - 1) {
                research(values, desValue, count, x + 1, y);
            }
            // 向下遍历
            if (y < values[0].length - 1) {
                research(values, desValue, count, x, y + 1);
            }
        }
    }
}


public class Count {
    private int count;

    public void addOne() {
        count++;
    }
    public int getCount() {
        return count;
    }
}

class Test3Main {
    private static int[][] points = new int[][] {
            {
                    1, 1, 1, 1, 1, 1, 1, 1, 1, 1
            }, {
                    1, 1, 1, 1, 0, 1, 1, 1, 1, 1
            }, {
                    1, 1, 1, 1, 1, 0, 0, 1, 1, 1
            }, {
                    1, 1, 0, 0, 0, 1, 1, 1, 1, 1
            }, {
                    1, 1, 0, 0, 0, 1, 1, 1, 1, 1
            }, {
                    1, 1, 1, 1, 0, 0, 1, 1, 1, 1
            }, {
                    1, 1, 1, 1, 1, 0, 1, 1, 1, 1
            }, {
                    1, 1, 1, 1, 1, 0, 0, 0, 1, 1
            }, {
                    1, 1, 1, 1, 1, 1, 1, 0, 1, 1
            }, {
                    1, 1, 1, 1, 1, 1, 1, 1, 1, 1
            },
    };
    public static void main(String[] args) {
         System.out.println(Question.run(points, 4, 3));
    }
}


得到出现次数了,再算面积就简单了吧!
16 楼 chriszeng87 2010-12-21  
不知道发到这里合不合适了,这道题想了好久了,也没什么思路:  对于一个整数矩阵,存在一种运算,对矩阵中任意元素加一时,需要其相邻(上下左右)某一个元素也加一,现给出一正数矩阵,判断其是否能够由一个全零矩阵经过上述运算得到。 求指点。
15 楼 asle 2010-12-19  
chriszeng87 写道
让记录成为一种习惯,是一个想要在以后留下点什么东西的人该做的事。记录是一个人积累的过程,看再多的书,如果没有记录下来,过一个时间后就跟没看一样。看自己写下的东西和看别人写的东西是不一样的,主要体现在理解速度上,因为中间缺少了将别人的思维翻译成自己思维的过程。

在记录中学会思考、学会探索。

记录可以消除自己烦躁的情绪。

每天抽出一到两个小时来记录自己的所学和自己的思考,这样一直的坚持那么当你回过头来看看的时候,你会发现你已经收获了很多了。

转的,说的真不错

写出来的才是真正懂了,从厚到薄,再从薄到厚
14 楼 chriszeng87 2010-12-19  
meiyoudao 写道
你这是啥职位啊????  这些东西..见都没见过

Software Design Engineer
13 楼 meiyoudao 2010-12-19  
你这是啥职位啊????  这些东西..见都没见过
12 楼 chriszeng87 2010-12-18  
kdlan 写道
1 应该是算闭包的变形吧

能不能再详细一点的,您说的闭包是不是您楼下所说的凸包啊?
11 楼 uddjatigmh199 2010-12-18  
1.对每种颜色应用凸包.....
10 楼 kdlan 2010-12-17  
1 应该是算闭包的变形吧
9 楼 生活小丑 2010-12-17  
chriszeng87 写道
让记录成为一种习惯,是一个想要在以后留下点什么东西的人该做的事。记录是一个人积累的过程,看再多的书,如果没有记录下来,过一个时间后就跟没看一样。看自己写下的东西和看别人写的东西是不一样的,主要体现在理解速度上,因为中间缺少了将别人的思维翻译成自己思维的过程。

在记录中学会思考、学会探索。

记录可以消除自己烦躁的情绪。

每天抽出一到两个小时来记录自己的所学和自己的思考,这样一直的坚持那么当你回过头来看看的时候,你会发现你已经收获了很多了。

转的,说的真不错

看再多的书,如果没有记录下来,过一个时间后就跟没看一样    这句话有感觉......
8 楼 jasin2008 2010-12-16  
算法
心中永远的痛
7 楼 chriszeng87 2010-12-16  
4在很多书上有,《编程之美》上感觉写的不太好,不过还有个扩展题:求空间中n个点中距离最远的两点,这个有人想过么? http://yinhail.ycool.com/post.4507062.html 上有解,不过我没看懂额
6 楼 lj30936 2010-12-16  
1。好像就是广度优先搜索吧
2。根据边建图,然后拓扑遍历图
3。同楼上
4。最小距离点对,网上有nlogn算法
5 楼 lykm02 2010-12-16  
1 暂没思路
2 好像是图的拓扑有序。数据结构课本里面有的吧
3 快慢指针,如果相遇说明有环
4 算法课本上有的,经典算法
ok
4 楼 chriszeng87 2010-12-16  
cectsky 写道
你的头像很像土匪

某已故日本音乐人
3 楼 chriszeng87 2010-12-16  
让记录成为一种习惯,是一个想要在以后留下点什么东西的人该做的事。记录是一个人积累的过程,看再多的书,如果没有记录下来,过一个时间后就跟没看一样。看自己写下的东西和看别人写的东西是不一样的,主要体现在理解速度上,因为中间缺少了将别人的思维翻译成自己思维的过程。

在记录中学会思考、学会探索。

记录可以消除自己烦躁的情绪。

每天抽出一到两个小时来记录自己的所学和自己的思考,这样一直的坚持那么当你回过头来看看的时候,你会发现你已经收获了很多了。

转的,说的真不错

相关推荐

    常用算法介绍,及其几道算法题,常见算法包括排序算法、搜索算法、动态规划、贪心算法、回溯算法、分治算法等

    常用算法介绍,及其几道算法题,常见算法包括排序算法、搜索算法、动态规划、贪心算法、回溯算法、分治算法等

    10道经典算法习题与详细解析.docx

    10道经典算法习题与详细解析.docx 10道经典算法习题与详细解析.docx 10道经典算法习题与详细解析.docx 10道经典算法习题与详细解析.docx 10道经典算法习题与详细解析.docx 10道经典算法习题与详细解析.docx 10道经典...

    几道算法选择题 几道算法选择题

    算法选择题知识点总结 一、分支限界法与回溯法 * 分支限界法和回溯法都是在问题的解空间树 T 上搜索问题的解,二者的区别在于:分支限界法的目标是寻找满足约束条件的解,而回溯法的目标是寻找问题的所有可能解。 ...

    算法入门习题100道

    这些习题可能涵盖了以下几个核心算法领域: 1. **排序算法**:包括但不限于冒泡排序、插入排序、选择排序、快速排序、归并排序、堆排序等。学习排序算法有助于理解数据如何在不同条件下的组织和操作。 2. **查找...

    面试中经常被问到的80道算法题

    算法面试题知识点总结 ...这八十道算法面试题涵盖了广泛的知识点,包括数据结构、算法设计、时间复杂度分析等多方面的内容。通过学习和实践这些题目,我们可以提高自己的编程能力和解决问题的能力。

    50道Java程序算法题

    这份"50道Java程序算法题"的压缩包显然旨在帮助开发者提升算法设计和实现能力。下面,我们将深入探讨这些标签所涵盖的知识点,并根据提供的文件名推测可能的结构。 1. **Java基础**:作为Java程序员,对语言的基础...

    java经典算法90题含源码及答案.rar

    通过解决这些算法题,开发者可以锻炼逻辑思维,理解和掌握数据结构,如数组、链表、栈、队列、树、图等,以及排序、搜索、图论、动态规划等核心算法。 在JAVA经典算法40题.doc中,可能包含的题目类型有递归、分治、...

    java笔试算法题40道

    根据提供的文件信息,我们可以归纳总结出以下几个主要的IT知识点: ### 1. 兔子繁殖问题(斐波那契数列) #### 解题思路与代码实现 - **问题描述**:一对兔子从第三个月开始每个月都会产下一对新兔子,而新生的...

    java经典算法题

    Java经典算法题是程序员在开发过程中常常需要面对的挑战,它们可以帮助我们提升编程思维,优化问题解决能力,尤其是在处理复杂数据结构和高效计算时显得尤为重要。这个压缩包中包含了一份名为"JAVA经典算法40题.doc...

    76经典道算法题及解答

    《76经典道算法题及解答》是一份珍贵的资源,涵盖了编程领域中76个经典的算法题目及其详细的解决方案。这些题目旨在帮助程序员提升算法思维、优化问题解决能力,并为面试准备提供实战素材。标签“算法”和“解答”...

    JAVA经典算法面试39题及答案

    JAVA经典算法面试39题及答案 本资源总结了39道经典的 JAVA 算法面试题目,每个题目都附带答案,涵盖了常见的算法问题,旨在帮助读者更好地掌握 JAVA 编程语言和算法设计。 算法概述 算法是计算机科学中最重要的...

    IT公司笔试算法题

    以上题目都是IT公司在笔试中常见的算法题,旨在检验应聘者的编程基础、逻辑思维能力和问题解决能力。对于准备面试或提高编程技能的人员来说,理解和掌握这些基本算法是非常重要的。通过解决这些问题,可以提升对递归...

    自己总结的二十四道js算法题

    js所有的算法,自己总结的,如有遗漏,请留言。希望可以帮助到需要的人

    Android面试算法题

    ### Android面试算法题知识点解析 #### 一、基础算法题:找出未放入数组中的两个数 **题目背景:** 在Android开发过程中,处理数组是非常常见的需求之一。此题旨在考察应聘者对基本数据结构(如数组)的理解以及...

    经典面试算法题N道

    ### 经典面试算法题解析 #### 1. 把二元查找树转变成排序的双向链表(树...以上是部分经典面试算法题的详细解析,每道题目都包含了题目背景、解题思路和示例代码,旨在帮助读者理解这些算法题的核心思想及其应用场景。

    蓝桥杯18年最全算法训练试题181道(含vip试题)

    构造最小生成树可以使用Kruskal算法或Prim算法,本题中可能需要结合贪心思想来优化路径选择,确保访问每个牧场的总时间最少。 7. 逆序对(ALGO-7) 逆序对的计算是排序算法中的一个重要概念,它表示在一个序列中,...

    字节跳动最爱考的 64 道算法题1

    《字节跳动最爱考的 64 道算法题1》这篇文章是关于准备面试时,特别是针对字节跳动等大厂面试所必备的算法题目的汇总。作者通过自己的面试经历,精选了64道高频率出现的算法题,并按照不同的数据结构和算法类型进行...

    大厂算法面试题库中高频出现的30道典型题.pdf

    根据提供的文件内容,我们可以提炼出以下30个典型的算法面试题的知识点。 1. 字符串中不含有重复字符的最长子串长度问题。这个问题考察对滑动窗口技巧的掌握,需要在遍历字符串的同时保持一个窗口,该窗口内没有...

    java经典算法练习题

    本压缩包包含了三个文档,分别是“JAVA经典算法40题.doc”、“最新JAVA编程题全集_50题及答案.doc”和“50道JAVA基础编程练习题.doc”,这些资源为初学者提供了大量的实践机会,有助于深入理解和运用Java。...

Global site tag (gtag.js) - Google Analytics