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

算法编程(五)

 
阅读更多

一、指定一个正序排列的数组和目标数字S,从数组中找到两个元素它们的和值为S(数字不重复,如果有多个,只需要得到一组即可)

    题目很好理解,比如输入数组{1,3,4,6,8,11,20}和目标数字11,那么其中3、8的和值为11,找到它们即可。

    这个题目最粗暴的解法就是逐个元素遍历数组,逐个相加...比如从1开始,让1与此后的每个元素相加并判断和值是否等于11,直到相等或者和值大于11结束,当和值大于11时,则结束本次遍历,然后从3开始再开始一轮...时间复杂度很高。

 

    这个题的关键:数组是排序的,既然只需要找到一对元素即可,那么我们假定它的值是一个大数 + 小数;那么我们就可以定义两个指针,从数组的两端开始遍历。

数组:
1 3 4 6 8 11 20

1)
左端指针从1开始,右端指针从20开始。
2)
1 + 20 > 11
由此可见,大数太大了,所以右端指针向小数方向移动
3)
1 + 11 > 11,同理
4)
1 + 8 < 11
以为这我们的小数选的太小了,所以左端指针向大数方向移动
5)
2 + 8 < 11,同理
6)
3 + 8 = 11,找到结果了

 

    代码样例:

public static void find(int[] source,int target) {
    if(source.length == 0) {
        return;
    }
    int li = 0;
    int ri = source.length - 1;
    while (true) {
        if(li >= ri) {
            System.out.println("Not found");
            break;
        }
        int left = source[li];
        int right = source[ri];
        if(left + right == target) {
            System.out.println(left + "," + right);
            break;
        }else if(left + right > target) {
            ri--;
        }else {
            li++;
        }
    }
}

  

二、给定一个数字S,请找出和值为S的所有连续的数字列表,从1开始

    比如指定数字为9,那么其符合要求的连续数字包括:1 + 2 + 3 + 4 = 4 + 5。

    这个算法的实现,和第一题几乎如出一辙;我们要选定两个数字分别作为初始的大数和小数,small = 1,big = 2;因为 1 +2 < 9,所以big向后选择,直到4,此时和值为9;然后small向后选择、big也向后:2 + 3 +4 +5,此值和值大于9,那么small只能向后驱动(减少参加计算的数字),直到等于9或者剩余一个数字位置..

 

    代码样例:

public static void find(int[] source,int target) {
    if(source.length == 0) {
        return;
    }
    int small = 1;
    int big = 2;
    int current = big + small;
    while (true) {
        if(small == big) {
            break;
        }
        if(current == target ) {
            System.out.println(small + "~" + big);
            big++;
            current += big;
            current -= small;
            small++;
        }else if(current < target) {
            big++;
            current += big;
        }else {
            current -= small;
            small++;
        }
    }
}

 

三、将一个字符串中单词出现的顺序翻转

    比如字符串(字符数组)“I am a student!”,翻转成“student! a am I”,注意只是翻转单词出现的顺序,仍保持单词原样。

    这个题的解法非常多,特别是使用高级API的时候特别容易,但是我们此处有个要求,不能使用高级API,不能额外使用新的空间。该怎么办?

 

    这就限定程序只能在原有的字符数组上进行翻转顺序,思路:

    1)首先将整个字符数组翻转,得到“!tneduts a ma I”。

    2)然后遍历上述字符串,遇到空格分隔符时,利用相同的算法,将空格之间的字符数组翻转。比如遇到一个空格时,将“!tneduts”翻转成“student”。

 

    代码样例:

public static String reserveWords(String source) {
    if(source == null || source.isEmpty()) {
        return source;
    }
    char[] chars = source.toCharArray();
    reserve(chars,0,chars.length - 1);
    char space = ' ';
    int start = 0;
    for(int i=0; i < chars.length - 1; i++) {
        if(chars[i] == space) {
            reserve(chars,start,i - 1);
            start = i+1;
        }
    }
    return new String(chars);
}

private static void reserve(char[] source,int start,int end) {
    if(start >= end) {
        return;
    }
    while (true) {
        if(start >= end) {
            break;
        }
        char tmp = source[start];
        source[start] = source[end];
        source[end] = tmp;
        start++;
        end--;
    }
}

 

四、指定一个字符数组和位置,将此位置之前的字符串和其之后的字符串交换位置

     比如输入“abcdefg”和3,那么3对应的字符串为d,即将“abc”交换到“defg”之后,最终字符数组为“defgabc”。

     说实话,这个题我第一感觉也没思路,我想到的那个笨办法一定不是理想的。我们还需要参照上题,既然是反转字符串,基本思路相同。

原始字符串:abcdefg
分割点:d
1根据分割点,将字符数组分成2部分
abc|defg

2)分别对两部分反转
cba|gfed

3)然后在整体进行反转即可得到结果
defgabc

由此可见,整体思路与上题相同,但是分解过程正好相反。

 

    代码样例: 

public static String reserve(String sources,int position) {
    if(sources == null || sources.isEmpty()) {
        return null;
    }
    char[] chars = sources.toCharArray();
    if(position < 0 || position >= chars.length) {
        throw new RuntimeException("Error!");
    }
    reserve(chars,0,position - 1);
    reserve(chars,position,chars.length - 1);
    reserve(chars,0,chars.length - 1);
    return new String(chars);
}

private static void reserve(char[] source,int start,int end) {
    if(start >= end) {
        return;
    }
    while (true) {
        if(start >= end) {
            break;
        }
        char tmp = source[start];
        source[start] = source[end];
        source[end] = tmp;
        start++;
        end--;
    }
}

 

分享到:
评论

相关推荐

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

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

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

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

    算法&&编程

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

    java 遗传算法 编程

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

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

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

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

    本资料主要关注并行计算的三个方面:结构、算法和编程,旨在通过习题解答帮助学习者深入理解和应用这些概念。 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例"这个资源集成了多种编程语言下的基础算法实例,旨在帮助程序员理解和掌握算法的基本概念,以及如何在实际编程中...

    编程实现路由算法

    运用各种编程语言实现基于Dijkstra 算法的路由软件。

Global site tag (gtag.js) - Google Analytics