【算法】网上看到的5个问题

网上看到的5个问题,下面是解答,不知道有没有其他建议!

问题1

使用for循环、while循环和递归写出3个函数来计算给定数列的总和。

package com.luka;

public class Javat {

    private static int[] arr_Ints = { 2, 1, 4, 3, 6, 5, 8, 7, 10, 9 };

    public static void main(String[] args) {
        System.out.println("The Count is " + getNumByFor() + " .");
        System.out.println("The Count is " + getNumByWhile() + " .");
        System.out.println("The Count is " + getNumByEcursion(0) + " .");
    }

    /**
     * for 循环
     */
    private static int getNumByFor() {
        int count = 0;
        for (int i = 0; i < arr_Ints.length; i++) {
            count += arr_Ints[i];
        }
        return count;
    }

    /**
     * while 循环
     */
    private static int getNumByWhile() {
        int count = 0;
        int i = 0;
        while (i < arr_Ints.length) {
            count += arr_Ints[i];
            i++;
        }
        return count;
    }

    /**
     * 递归
     */
    private static int getNumByEcursion(int i) {
        if (arr_Ints.length == 0)
            return 0;
        else if (i < arr_Ints.length - 1)
            return arr_Ints[i] + getNumByEcursion(i + 1);
        else
            return arr_Ints[i];
    }
}

问题2

编写一个交错合并列表元素的函数。例如:给定的两个列表为[a,B,C]和[1,2,3],函数返回[a,1,B,2,C,3]。

package com.luka;

public class Javat {

    private static String[] arr1 = { "a", "B", "c", "D", "e" };
    private static String[] arr2 = { "1", "2", "3" };

    public static void main(String[] args) {
        String[] arr = getNum(arr1, arr2);
        for (int i = 0; i < arr.length; i++)
            System.out.println("The Num is " + arr[i] + " .");
    }

    private static String[] getNum(String[] arr12, String[] arr22) {
        String[] arr = new String[arr1.length + arr2.length];
        int i, j;
        for (i = 0, j = 0; i < arr1.length; i++) {
            j = 2 * i;
            if (j > 2 * arr2.length)
                j = arr2.length + i;
            arr[j] = arr1[i];
        }
        for (i = 0, j = 0; i < arr2.length; i++) {
            j = 2 * i + 1;
            if (j > 2 * arr1.length)
                j = arr1.length + i;
            arr[j] = arr2[i];
        }
        return arr;
    }

}

问题3

编写一个计算前100位斐波那契数的函数。根据定义,斐波那契序列的前两位数字是0和1,随后的每个数字是前两个数字的和。例如,前10位斐波那契数为:0,1,1,2,3,5,8,13,21,34。

package com.luka;

public class Javat {
    public static void main(String[] args) {
        try {
            System.out.println("The Nums is " + getCount(100) + " .");
        } catch (Exception e) {
        }
    }

    // 获取值
    private static int getNum(int num) {
        int count = 0;
        if (num <= 1)
            count = 0;
        else if (num == 2)
            count = 1;
        else
            count = getNum(num - 1) + getNum(num - 2);
        return count;
    }

    // 获取和
    private static String getCount(int num) {
        String strNums = "";
        for (int i = 0; i <= num; i++) {
            strNums += getNum(i) + ",";
        }
        strNums = strNums.substring(0, strNums.length()-1);
        return strNums;
    }

}

问题4

编写一个能将给定非负整数列表中的数字排列成最大数字的函数。例如,给定[50,2,1,9],最大数字为95021。

package com.luka;

import java.util.Arrays;
import java.util.Comparator;

public class Javat {

    private static Integer[] VALUES = { 50, 2, 100, 99, 5, 7, 51,50 ,11};

    public static void main(String[] args) {
        Arrays.sort(VALUES, new Comparator<Object>() {
            @Override
            public int compare(Object lhs, Object rhs) {
                String v1 = lhs.toString();
                String v2 = rhs.toString();

                return (v1 + v2).compareTo(v2 + v1) * -1;
            }
        });

        String result = "";
        for (Integer integer : VALUES) {
            result += integer.toString();
        }

        System.out.println(result);
    }

}

问题5

编写一个在1,2,…,9(顺序不能变)数字之间插入+或-或什么都不插入,使得计算结果总是100的程序,并输出所有的可能性。例如:1 + 2 + 34 – 5 + 67 – 8 + 9 = 100。

package com.luka;

import java.util.ArrayList;

public class Javat {
    private static int TARGET_SUM = 100;
    private static int[] VALUES = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

    private static ArrayList add(int digit, String sign, ArrayList branches) {
        for (int i = 0; i < branches.size(); i++) {
            branches.set(i, digit + sign + branches.get(i));
        }

        return branches;
    }

    private static ArrayList f(int sum, int number, int index) {
        int digit = Math.abs(number % 10);
        if (index >= VALUES.length) {
            if (sum == number) {
                ArrayList result = new ArrayList();
                result.add(Integer.toString(digit));
                return result;
            } else {
                return new ArrayList();
            }
        }

        ArrayList branch1 = f(sum - number, VALUES[index], index + 1);
        ArrayList branch2 = f(sum - number, -VALUES[index], index + 1);

        int concatenatedNumber = number >= 0 ? 10 * number + VALUES[index] : 10
                * number - VALUES[index];
        ArrayList branch3 = f(sum, concatenatedNumber, index + 1);

        ArrayList results = new ArrayList();

        results.addAll(add(digit, "+", branch1));
        results.addAll(add(digit, "-", branch2));
        results.addAll(add(digit, "", branch3));

        return results;
    }

    public static void main(String[] args) {
        ArrayList list = f(TARGET_SUM, VALUES[0], 1);
        for(int i=0;i<list.size();i++)
        {
            System.out.println(list.get(i));
        }
    }

}

输出结果:

1+2+3-4+5+6+78+9
1+2+34-5+67-8+9
1+23-4+5+6+78-9
1+23-4+56+7+8+9
12+3+4+5-6-7+89
12+3-4+5+67+8+9
12-3-4+5-6+7+89
123+4-5+67-89
123+45-67+8-9
123-4-5-6-7+8-9
123-45-67+89

来源:http://developer.51cto.com/art/201505/476097.htm

时间: 2024-12-25 23:06:35

【算法】网上看到的5个问题的相关文章

A*算法(附c源码)

关于A*算法网上介绍的有很多,我只是看了之后对这个算法用c写了一下,并测试无误后上传以分享一下,欢迎指正!下面是我找的一个介绍,并主要根据这个实现的. 寻路算法不止 A* 这一种, 还有递归, 非递归, 广度优先, 深度优先, 使用堆栈等等, 有兴趣的可以研究研究~~ 简易地图 如图所示简易地图, 其中绿色方块的是起点 (用 A 表示), 中间蓝色的是障碍物, 红色的方块 (用 B 表示) 是目的地. 为了可以用一个二维数组来表示地图, 我们将地图划分成一个个的小方块. 二维数组在游戏中的应用是

按照索引的细化提取骨架算法的java实现

近期研究验证码识别,也就看了一些图像识别的资料,其中一种字体细化提取骨架的算法网上没有java版的实现,所以就选取了一个python实现版本进行java代码的改写.. python版实现的地址: http://www.cnblogs.com/xianglan/archive/2011/01/01/1923779.html 由于我不是很懂python语法,也是直接去的w3c看的教程,为此还掉进了一个坑..详见: http://www.cnblogs.com/chyu/p/4335950.html

字符串匹配(KMP 算法 含代码)

主要是针对字符串的匹配算法进行解说 有关字符串的基本知识 传统的串匹配法 模式匹配的一种改进算法KMP算法 网上一比較易懂的解说 小样例 1计算next 2计算nextval 代码 有关字符串的基本知识 串(string或字符串)是由零个或多个字符组成的有限序列,一般记为 当中s是串的名,用单引號括起来的字符序列是串的值:ai(1<=i<=n)能够是字母.数值或其它字符.串中字符的数组 n称为串的长度.零个字符的串称为空串,它的长度为0 串中随意个连续的字符组成的子序列称为该串的子串. 包括子

对弈类游戏的人工智能(2)--学习算法

前言: 对弈类游戏的智能算法, 网上资料颇多, 大同小异. 我写这篇文章, 一方面是对当年的经典<<PC游戏编程(人机博弈)>>表达敬意, 另一方面, 也想对自己当年的游戏编程人生做下回顾. 上一篇博文:对弈类游戏的人工智能(1)--评估函数+博弈树算法, 着重讲述了评估函数+博弈树, 本文着重讲述学习算法, 以及性能优化和游戏性问题. 分析: 评估函数的引入, 为游戏AI提供了理论基础. G(s) = a1 * f1(s) + a2 * f2(s) + ... + an * fn

Akamai在内容分发网络中的算法研究(翻译总结)

BLOOM FILTERS Bloom filters的研究主要用在akamai的CDN中的两个场景:1)索引管理优化:2)内容过滤. Bloom filters是hash算法的一个变种,有非常优秀的空间效率(使用位数组)和时间效率(插入的时间复杂度稳定为常数),但是会有一定的错误率.直观的说,bloom算法类似一个hash set,用来判断某个元素(key)是否在某个集合中.和一般的hash set不同的是,这个算法无需存储key的值,对于每个key,只需要k个比特位,每个存储一个标志,用来判

F - Rain on your Parade - hdu 2389(二分图匹配,Hk算法)

题意:给一些人和一些伞的坐标,然后每个人都有一定的速度,还有多少时间就会下雨,问最多能有多少人可以拿到伞. 分析:题意很明确,可以用每个人和伞判断一下是否能够达到,如果能就建立一个联系.不过这道题的数据还是挺大的,第一次使用的匈牙利算法果断的TLE了,然后就百度了一下发现有一个 Hopcroft-Karp算法 不过这个算法网上描述的很少,而且都说的比较含糊不清,不过幸好搜到一个比较不错的课件,看了一上午总算有些明白怎么回事,以前是寻找一个增广路,这个是寻找所有的增广路,并且使用BFS进行分层,看

bzoj 1191: [HNOI2006]超级英雄Hero 并查集 || 匈牙利算法

1191: [HNOI2006]超级英雄Hero Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1804  Solved: 850[Submit][Status] Description 现在电视台有一种节目叫做超级英雄,大概的流程就是每位选手到台上回答主持人的几个问题,然后根据回答问题的多少获得不同数目的奖品或奖金.主持人问题准备了若干道题目,只有当选手正确回答一道题后,才能进入下一题,否则就被淘汰.为了增加节目的趣味性并适当降低难度,主持人总

cocos2d-x 3.6 连连看算法

我的原创博客:http://blog.csdn.net/dawn_moon 好了,在开始讲连连看游戏场景之前先来讲讲连连看算法. 连连看算法网上有很多,算法控首先想到的就是广度优先搜索,求出路径,然后求最小拐弯路径. 这个算法可以,但是对没有学过算法的同学可能有点困难,我这里也不讲. 我百度到一个比较通俗简便的算法,拿来用一下 在开始讲算法之前,讲一下地图布局,假设 4*4 的棋盘. 初始化地图,将要加载的图片在地图上绘制出来,每一种一次性绘制两次,确保偶数个.如图一 遍历棋盘,随机打乱布局,这

php冒泡算法

1.冒泡算法 网上搜了很多,但是总是对于每次循环的边界值思路讲的比较笼统.不是很容易被新手记住,我自己平时也是硬记下来的.但是对于算法,硬记,时间长了还是容易忘记,所以自己写了一次,把每次思路尽量写下来,便于理解,理解了容易加深映像,不容易忘记了. 冒泡算法,核心就是 循环比对  每次比对相邻2个数组的大小,然后把最大的数组放到后面,这样所有比对循环一次,就会把数组中最大的数放到数组最后, 然后重复循环(重复上面的比对循环):此时循环的时候 最后一个值是不需要参加循环了,因为已经确定是最大的那个

限流算法 - 基本实现

在开发高并发系统时有三把利器用来保护系统:缓存.降级. 限流 , 今天我们就谈谈限流 缓存:缓存的目的是提升系统访问速度和增大系统处理容量 降级:降级是当服务器压力剧增的情况下,根据当前业务情况及流量对一些服务和页面有策略的降级,以此释放服务器资源以保证核心任务的正常运行 限流:限流的目的是通过对并发访问/请求进行限速,或者对一个时间窗口内的请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务.排队或等待.降级等处理 ? 我下面算法的实现基本上都用到了定时器Timer , 其实关于时间的也可以