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

算法编程(四)

 
阅读更多

一、给定一个整数序列,请获取最小(最大)的K个数字

    这个题还算比较熟悉,在大数据计算时,经常会遇到类似于“Top N”的情况,这个题的解法有很多种,本例还是采用惯例做法:创建一个K大小的容器,容器内的数字都是排序的;在遍历输入序列时,如果遇到比容器内最大值还要大的数字时,则将容器中的最小值移除,即容器中保留K个“已经遇见”的最大数字。在java中,我们直接使用TreeSet作为容器,当然你也可以自己构建一个红黑数。

    代码样例:

public static TreeSet<Integer> find(int[] source,int k) {
    TreeSet<Integer> top = new TreeSet<>();
    for(int i= 0; i< source.length; i++) {
        int item = source[i];
        if(top.isEmpty() || top.size() < k) {
            top.add(item);
            continue;
        }

        if(top.last() > item) {
            top.add(item);
            top.pollLast();//移除最后一个
        }
    }
    return top;
}

 

二、给定一个整数数组序列,请计算出“连续子数组”和值的最大值,数组中正负值都有,无序

    描述:输入一个数组,这个数组中有正、负整数组成,求数组中“连续的几个元素”的和值的最大值;比如原始数组为{1,-2,3,10,-4,7,2,-5},其中{3,10,-4,7,2}这个子数组的和值最大,为18。

 

    这个题其实并不复杂,认识到判断时机就可以突破了。

数组:1,-2,3,10,-4,7,2,-5

1)
初始最大值为,max = 1,即数组的第一个元素。
2)
1,-2和值为-1,因为-1比max小,继续。
3)
-1,3和值为-2,此时我们就需要做中断了,因为-2比当前元素3的值还要小,
因此我们可以断定,前面的“子数组”的计算是无效的
(只要它参与计算,只会降低总和);
所以此时,我们将3作为新子数组的开始,max = 3,继续遍历。
4)
遍历时,如果和值比当前max大,则替换max。
直到数组的结尾!

 

    代码样例:

private static int maxSum(int[] source) {
    if(source.length == 0) {
        throw new RuntimeException("Empty array!");
    }

    int max = source[0];
    int length = source.length;
    int current = max;
    for (int i = 1 ; i < length; i++) {
        current = source[i] + current;
        if (current <= source[i]) {
            max = source[i];
            current = max;
            continue;
        }
        if(current > max) {
            max = current;
        }
    }
    return max;
}

 

三、给定一个字符数组,请获得此数组中重复出现次数最多的字符元素(字符元素一定有重复)

    这个题,其实很简单,如果你钻了牛角尖,估计就比较麻烦:比如你尝试使用逐个遍历比较的方式!我们已知的字符是有限的,我们可以使用Map来保存每个字符以及其出现的次数,这样就很容易得到答案,Map的key为字符值,value为其出现的次数。

    代码样例:

public static char maxTimes(char[] sources) {
    if(sources.length == 0) {
        throw new RuntimeException("Empty array!");
    }
    int maxTimes = 1;
    char result = sources[0];
    Map<Character,Integer> container = new HashMap<>();
    for(int i = 0;i < sources.length; i++) {
        char item = sources[i];
        if(container.containsKey(item)) {
            Integer times = container.get(item);
            times++;
            if(times > maxTimes) {
                maxTimes = times;
                result = item;
            }
            container.put(item,times++);
        }else {
            container.put(item,1);
        }
    }
    return result;
}

 

    题目的变种可以为:

    给定1亿个数字,它们被保存在文件中,请你找出出现次数最多的哪个数字!

    思路为分治法,将数组取模并分散存储在多个小文件中,确保相同的数字被转存在相同的文件中,然后逐个计算每个文件中出现次数最多的数字,然后取次数最多的那个即可。

 

四、有两个单向链表,它们在某个节点开始,后续节点都重合,请你用程序找出首个重合点。

    比如如下两个链表:

    1-->2-->3-->4-->5-->6-->7

    7-->10->5-->6-->7

    我们看出,5是这两个链表的首个重合点。要实现这个算法,用粗暴的方式逐个遍历复杂度太高,当然实现起来简单。我们在上述几个题目都已经表示,对于单向链表,从后遍历或者查找,最好的办法就是借助辅助栈,这个题目我们也这么做。

    用两个辅助栈分表保存链表的节点,然后同时逐个弹出,并比较栈顶的值,直到第一个不相同的节点出现为止。代码样例如下:

public static Node joinPoint(LinkedNodes first,LinkedNodes second) {
    if(first == null || second == null) {
        return null;
    }
    Node  firstRoot = first.header.next;
    Node secondRoot = second.header.next;
    if(firstRoot == null || secondRoot == null) {
        return null;
    }
    //借助辅助栈,将单向链表反序
    Stack<Node> data1 = new Stack<>();
    Stack<Node> data2 = new Stack<>();
    while (true) {
        Node item = firstRoot.next;
        if(item == null) {
            break;
        }
        data1.push(item);
    }

    while (true) {
        Node item = secondRoot.next;
        if(item == null) {
            break;
        }
        data2.push(item);
    }

    //依次弹出栈,并比较,最后一个相同点就是join点
    Node result = null;
    while (true) {
        Node n1 = data1.pop();
        Node n2 = data2.pop();
        if(n1.value != n2.value) {
            break;
        }else {
            result = n1;//or n2;
        }
    }
    return result;
}

 

五、求一个二叉树的最大深度

    二叉树的树深,就是root节点到最底层叶子节点的最大距离。很简单,递归实现;代码样例如下:

public static int depth(BinaryTreeNode node) {
    if(node == null) {
        return 0;
    }
    BinaryTreeNode left = node.left;
    int l = 0;
    if(left != null) {
        l = depth(left);
    }
    BinaryTreeNode right = node.right;
    int r = 0;
    if(right != null) {
        r = depth(right);
    }
    return l > r ? l + 1 : r + 1;
}

 

分享到:
评论

相关推荐

    JAVA算法编程题目及答案.doc

    JAVA算法编程题目及答案 本资源提供了50道JAVA算法编程题目及答案,涵盖了算法设计、数据结构、程序设计等多个方面的知识点。以下是对标题、描述、标签和部分内容的详细解释: 标题:JAVA算法编程题目及答案 本...

    C#数值计算算法编程(周长发)

    C#数值计算算法编程 周长发,有利于数值算法编程开发

    算法&&编程

    《算法&&编程》这个主题包含了两个至关重要的计算机科学领域,它们是解决问题和构建软件系统的基础。算法是设计解决特定问题的步骤序列,而编程则是将这些算法转化为计算机可执行的语言。这里,我们深入探讨这两个...

    java 遗传算法 编程

    通过阅读本书,你将熟悉遗传算法与编程语言相关的问题和概念,掌握构建自己的算法所需的全部知识,并且将获得用遗传算法解决问题的能力。请拿起本书,进入遗传算法这个迷人的领域,看看真正能工作的Java代码,并运用...

    并行计算——结构·算法·编程习题答案

    本资料主要关注并行计算的三个方面:结构、算法和编程,旨在通过习题解答帮助学习者深入理解和应用这些概念。 1. **并行计算结构**: 并行计算结构通常分为共享内存和分布式内存两大类。共享内存系统中,所有...

    C#数值计算算法编程.zip

    12 用 C#实现数伯叶算算法的要点 7 第 2 章 复数运算 .................................. · ·12 2.1 复数类设计 12 2.2 复数乘法 25 23 复数附法 26 2.4 复数的膜 书,27 25 复数的根 28 2.6 复数的实茄指数 29...

    2023年度第四届全国大学生算法设计与编程挑战赛(春季赛)A类三人组获奖名单公示.pdf

    "2023年度第四届全国大学生算法设计与编程挑战赛(春季赛)A类三人组获奖名单公示" 该文件标题和描述中涉及到的知识点包括: 1. 算法设计与编程挑战赛:该文件的标题和描述都提到了算法设计与编程挑战赛,这是一个...

    游戏核心算法编程内幕.pdf

    游戏算法电子书 感觉不错 分享给大家 游戏核心算法编程内幕.pdf

    游戏核心算法编程内幕

    《游戏核心算法编程内幕》由三部分组成。其中第一部分主要介绍游戏编程的基本概念;第二部分详细介绍游戏编程中的各种技术和算法;第三部分是附录,介绍游戏编程中相关技术和知识以及其他相关读物。《游戏核心算法...

    JAVA遗传算法编程pdf版本书籍

    《JAVA遗传算法编程》这本书是面向对遗传算法有兴趣并希望通过Java语言进行实现的读者的一本专业指南。遗传算法(Genetic Algorithm,简称GA)是一种基于生物进化论中的自然选择和遗传原理的优化方法,它在解决复杂...

    C#数值计算算法编程

    PDF格式的C#数值计算算法编程,记录了各种初级、高级算法。

    java遗传算法编程pdf

    一本基于java遗传算法编程技术的讲解书书籍,全书讲解很全面,适合对遗传算法感兴趣的读者。本书共分为6章,每章都会有实例。

    Python编程入门与算法进阶.pptx

    "Python编程入门与算法进阶.pptx" Python编程入门与算法进阶是一本全面介绍Python编程语言和算法的书籍。本书分为两个部分,第一部分是Python编程入门,第二部分是算法进阶。 在Python编程入门部分,本书详细讲解...

    并行计算——结构·算法·编程 习题答案

    在《并行计算——结构·算法·编程》这本书中,作者深入探讨了这一主题,提供了丰富的习题来帮助读者理解和掌握相关概念。现在,我们来详细探讨这些习题答案中可能涵盖的知识点。 首先,结构方面,可能包括以下内容...

    Scratch编程入门与算法进阶.pptx

    《Scratch编程入门与算法进阶》是一本面向青少年和初学者的Scratch编程和算法教育书籍,本书以图文并茂的方式,系统地介绍了Scratch编程的基础知识和常用算法,旨在帮助读者深入理解计算机编程的基本概念和思想,...

    [并行计算——结构·算法·编程].陈国良.文字版

    并行计算 陈国良编著 呵呵 大家来下载 是第三版《并行计算:结构•算法•编程(第3版)》是并行计算系列丛书之开篇,它以并行计算为主题,围绕并行计算机、并行算法和并行程序设计展开讨论,强调融并行计算机体系结构、...

    编程珠矶算法

    《编程珠矶算法》是一套深入探讨算法的电子书籍,旨在帮助读者理解并掌握各种重要的算法,提升编程技能。在计算机科学中,算法是解决问题或执行任务的精确步骤,是编程的基础。通过学习这些算法,开发者可以更有效地...

    编程语言算法100例

    在编程领域,算法是解决问题的核心工具,它们是逻辑和数学思维在编程中的应用。"编程语言算法100例"这个资源集成了多种编程语言下的基础算法实例,旨在帮助程序员理解和掌握算法的基本概念,以及如何在实际编程中...

Global site tag (gtag.js) - Google Analytics