- 浏览: 326064 次
- 性别:
- 来自: 西宁
文章分类
- 全部博客 (120)
- Java Thought (29)
- Java Pattern (4)
- Data Base (7)
- Algorithm Design (33)
- Linux (0)
- Mysql (2)
- Oracle (0)
- ConstructionDesign-架构 (5)
- Spring Platform (0)
- Tomcat (1)
- JavaScript (7)
- Web System (3)
- MS SQLServer (1)
- 软件哲学 (6)
- View (3)
- Java GUI (4)
- CSSDIV (7)
- CloudComputing (0)
- WebService (0)
- SystemOrProject (2)
- SOA (0)
- 互转共享 (3)
- 偶尔java习题 (0)
- Thinks with does (1)
最新评论
-
sassds:
佩服啊 高手
分享一款js特效 -
bhjackson:
学习啦,能否详细介绍下回溯的过程?O(∩_∩)O谢谢
分享回溯法- 找n个数中r个数的组合 -
zk7019311:
了解了解。。。。。
业务层代码复用的一点建议 -
lijie1819:
看到LZ的设计思想,感觉和抽象工厂模式有点相像。
业务层代码复用的一点建议 -
wjjcml1982:
酷毙了!楼主太强悍了!
分享一款js特效
1.先看一家大公司笔试题
数组中有n个数据,要将它们顺序循环向后移动k位,即前面的元素向后移动k位,后面的元素则循环向前移k位,例如,0、1、2、3、4循环移动3位后为2、3、4、0、1。考虑到n会很大,不允许用2n以上 个空间来完成此题。
1.1 算法1:
(1) 问题分析:
由数学知识,通过求余运算就可以解决"循环"后移的问题。
(2) 代码:
(3) 算法分析:
时间复杂度为O(n), 空间效率为O(2n).
1.2 算法2:
(1) 问题分析:
在算法有空间限制的情况下,一个简单的方法是:
<1> 将最后一个存储空间的数据存储在临时存储空间中。
<2> 其余数逐个向后移动一位。共操作k次就能完成问题的要求。
(2) 代码:
(3) 算法分析:
若要考虑到有k>n的可能性,这样的移动会出现重复操作,可以在输入数据后,执行k = k % n操作,可以保证不出现重复移动的情况。这时算法的移动(赋值)次数为k * n,当n较大时,算法的效率比较低。
时间复杂度为O(n * k), 空间效率为O(n).
1.3 算法3:
(1) 问题分析:可以用一个临时存储空间把每一个数据一次移动到位呢?
<1> 一组循环移动的情况:
通过计算可以确定某个元素移动后的具体位置,如n=5,k=3时,0、1、2、3、4循环移动3位后为2、3、4、0、1。知道为什么吗?可通过计算得出0移动到3的位置,3移动到1的位置,1移动到4的位置,4移动到2的位置,2移动到0的位置;一组移动(0-3-1-4-2-0)正好将全部数据按要求进行了移动。
<2> 多组循环移动的情况:
再看一个例子,当n=6,k=3时,0、1、2、3、4、5经移动的结果是3、4、5、0、1、2。
共有3组移动:0-3-0, 1-4-1, 2-5-2才能将全部数据操作完毕。
那么,循环移动的的组数与n、k有怎么样的关系呢?再看一个例子。
当n=6,k=2时,0、1、2、3、4、5经移动的结果是4、5、0、1、2、3。
共有2组移动:0-2-4-0, 1-3-5-1才能将全部数据操作完毕。
<3> 归纳总结:
由以上的分析和实例,可感知到循环移动的组数与n与k的最大公约数有关。
<4> 算法设计:
a. 求n和k的最大公约数m
b. 进行m组循环移动
c. 每组移动进行n/m次。
d. 某个元素移动的具体位置为: (i + k) % n
(2) 代码:
(3) 算法分析:
算法中,每组循环移动都是从前向后进行的,这样每次移动之前,都需要将后面的数据存入辅助存储空间中,一次移动需要两次赋值,
总体大约需要2n次。
数组中有n个数据,要将它们顺序循环向后移动k位,即前面的元素向后移动k位,后面的元素则循环向前移k位,例如,0、1、2、3、4循环移动3位后为2、3、4、0、1。考虑到n会很大,不允许用2n以上 个空间来完成此题。
1.1 算法1:
(1) 问题分析:
由数学知识,通过求余运算就可以解决"循环"后移的问题。
(2) 代码:
package boke.written; import java.util.Arrays; /** * 题目:数组中有n个数据,要将它们顺序循环向后移动k位,即前面的元素向后移动k位,后面的元素则循环 * 向前移k位,例如,0、1、2、3、4循环移动3位后为2、3、4、0、1。考虑到n会很大,不允许用2n以上 个空间来完成此题。 * * @since jdk1.5及其以上 * @author 毛正吉 * @version 1.0 * @date 2010.06.20 * */ public class GCDTest1 { /** * @param args */ public static void main(String[] args) { int[] a = { 0, 1, 2, 3, 4 }; int n = a.length; int[] b = new int[n]; int k = 3; for (int i = 0; i < n; i++) { b[(k + i) % n] = a[i]; // 求余解决循环后移 } System.out.println(Arrays.toString(b)); } }
(3) 算法分析:
时间复杂度为O(n), 空间效率为O(2n).
1.2 算法2:
(1) 问题分析:
在算法有空间限制的情况下,一个简单的方法是:
<1> 将最后一个存储空间的数据存储在临时存储空间中。
<2> 其余数逐个向后移动一位。共操作k次就能完成问题的要求。
(2) 代码:
package boke.written; import java.util.Arrays; /** * 题目:数组中有n个数据,要将它们顺序循环向后移动k位,即前面的元素向后移动k位,后面的元素则循环 * 向前移k位,例如,0、1、2、3、4循环移动3位后为2、3、4、0、1。考虑到n会很大,不允许用2n以上 个空间来完成此题。 * * @since jdk1.5及其以上 * @author 毛正吉 * @version 1.0 * @date 2010.06.20 * */ public class GCDTest2 { /** * @param args */ public static void main(String[] args) { int[] a = { 0, 1, 2, 3, 4 }; int n = a.length; int k = 3; int temp; int j; for (int i = 0; i < k; i++) { temp = a[n - 1]; // 最后一个存储空间的数据存储在临时存储空间中 for (j = n - 1; j > 0; j--) { // 其余数据逐个向后移动一位 a[j] = a[j - 1]; } a[0] = temp; } System.out.println(Arrays.toString(a)); } }
(3) 算法分析:
若要考虑到有k>n的可能性,这样的移动会出现重复操作,可以在输入数据后,执行k = k % n操作,可以保证不出现重复移动的情况。这时算法的移动(赋值)次数为k * n,当n较大时,算法的效率比较低。
时间复杂度为O(n * k), 空间效率为O(n).
1.3 算法3:
(1) 问题分析:可以用一个临时存储空间把每一个数据一次移动到位呢?
<1> 一组循环移动的情况:
通过计算可以确定某个元素移动后的具体位置,如n=5,k=3时,0、1、2、3、4循环移动3位后为2、3、4、0、1。知道为什么吗?可通过计算得出0移动到3的位置,3移动到1的位置,1移动到4的位置,4移动到2的位置,2移动到0的位置;一组移动(0-3-1-4-2-0)正好将全部数据按要求进行了移动。
<2> 多组循环移动的情况:
再看一个例子,当n=6,k=3时,0、1、2、3、4、5经移动的结果是3、4、5、0、1、2。
共有3组移动:0-3-0, 1-4-1, 2-5-2才能将全部数据操作完毕。
那么,循环移动的的组数与n、k有怎么样的关系呢?再看一个例子。
当n=6,k=2时,0、1、2、3、4、5经移动的结果是4、5、0、1、2、3。
共有2组移动:0-2-4-0, 1-3-5-1才能将全部数据操作完毕。
<3> 归纳总结:
由以上的分析和实例,可感知到循环移动的组数与n与k的最大公约数有关。
<4> 算法设计:
a. 求n和k的最大公约数m
b. 进行m组循环移动
c. 每组移动进行n/m次。
d. 某个元素移动的具体位置为: (i + k) % n
(2) 代码:
package boke.written; import java.util.Arrays; /** * 题目:数组中有n个数据,要将它们顺序循环向后移动k位,即前面的元素向后移动k位,后面的元素则循环 * 向前移k位,例如,0、1、2、3、4循环移动3位后为2、3、4、0、1。考虑到n会很大,不允许用2n以上 个空间来完成此题。 * * @since jdk1.5及其以上 * @author 毛正吉 * @version 1.0 * @date 2010.06.20 * */ public class GCDTest3 { /** * @param args */ public static void main(String[] args) { int[] a = { 0, 1, 2, 3, 4, 5}; int n = a.length; int k = 3; int m; int i; int j; int b0; int b1; int t; m = ff(n, k); // 最大公约数 for (j = 0; j < m; j++) { b0 = a[j]; t = j; for (i = 0; i < n/m; i++) { t = (t + k) % n; b1 = a[t]; a[t] = b0; b0 = b1; } } System.out.println(Arrays.toString(a)); } /** * 求a和b的最大公约数 * * @param a * @param b * @return */ public static int ff(int a, int b) { int i, t = 1; for (i = 2; i <= a && i <= b; i++) { while ((a % i == 0) && (b % i == 0)) { t = t * i; a = a / i; b = b / i; } } return t; } }
(3) 算法分析:
算法中,每组循环移动都是从前向后进行的,这样每次移动之前,都需要将后面的数据存入辅助存储空间中,一次移动需要两次赋值,
总体大约需要2n次。
评论
3 楼
qiyueguxing
2010-06-25
我很想知道楼上几位哥们从事的职业和行业
我猜测:1.你们是在校研究生
2.你们还未出大学校门
我猜测:1.你们是在校研究生
2.你们还未出大学校门
2 楼
litianzzk
2010-06-25
这个问题其实就是将一个有n+m个元素的数组的前n个元素和后m个元素交换位置,我记得《编程珠玑》里面有一个很妙的算法,是这样的,先将前n个元素位置反转,再将后m个元素的位置反转,最后整个数组倒转,这样就完成了。例如:
有数组1,2,3,4,5,6,7,现在要将5,6,7移到数组最前面,即得到5,6,7,1,2,3,4。可以这样做:
第一步,反转前4个元素的位置:4,3,2,1,5,6,7
第二步,反转后3个元素的位置:4,3,2,1,7,6,5
第三步,反转整个数组 :5,6,7,1,2,3,4
代码就不写了,因为非常简单。
很明显,时间复杂度O(n),空间效率O(1)。
有数组1,2,3,4,5,6,7,现在要将5,6,7移到数组最前面,即得到5,6,7,1,2,3,4。可以这样做:
第一步,反转前4个元素的位置:4,3,2,1,5,6,7
第二步,反转后3个元素的位置:4,3,2,1,7,6,5
第三步,反转整个数组 :5,6,7,1,2,3,4
代码就不写了,因为非常简单。
很明显,时间复杂度O(n),空间效率O(1)。
1 楼
mathfox
2010-06-25
这种老兄,你的代码都是自己写的,还是天天复制啊
发表评论
-
开散列的简单模拟(一)
2010-06-28 08:33 18291. 散列 散列有两种 ... -
递归和动态规划构造两个字符序列的最长公共字符子序列
2010-06-28 08:28 4500应je朋友要求,所以翻开以前的算法题目,整理了以下,给 ... -
信息数字化解逻辑题分享
2010-06-21 08:09 12641. 前提条件: 将逻辑题目中的信息用数字化描述。 ... -
递归算法分析-分享
2010-06-19 16:09 16111. 深入认识递归 (1) 递 ... -
非递归算法分析实例分享
2010-06-18 15:47 10591 仅仅依赖于问题规模的时间复杂度 (1) 例1: 交换i和 ... -
NP完全性问题
2010-06-18 14:02 7027在学习算法设计与分析时,经常会提到NP完全性问题,到底 ... -
算法分析精述分享
2010-06-18 12:03 8821. 算法分析的评价体系 评价算法的三条主要标准是: ... -
贪婪策略算法的总结分享
2010-06-11 08:30 61031. 贪婪算法描述 贪婪算法又叫登山法,它的根本思想是 ... -
带权有向图 - 边上权值非负情形的单源最短路径问题
2010-06-07 08:57 26921. 问题描述: 给定 ... -
是否很久没抽象和逻辑了呢? DODO它吧(很基础)四
2010-06-07 08:54 137621. 工作分配问题。 ... -
是否很久没抽象和逻辑了呢? DODO它吧(很基础)三
2010-06-07 08:53 110617. 字符统计问题。 编写一个算法,统计在一个输入 ... -
是否很久没抽象和逻辑了呢? DODO它吧(很基础)二
2010-06-07 08:47 13828. 数字迷问题。 A B C ... -
是否很久没抽象和逻辑了呢? DODO它吧(很基础)一
2010-06-07 08:38 11861. 线程问题。 设计4个线程,其中两个线程每次对j增加 ... -
是否很久没抽象和逻辑了呢? DODO它吧(很基础)
2010-06-07 08:37 18951. 线程问题。 设计 ... -
Java快速排序算法整理(二)
2010-05-31 14:04 1036package boke.sort; /** * 快 ... -
Java快速排序算法整理(一)
2010-05-31 13:39 662package boke.sort; /** * 快 ... -
Java最小堆实现
2010-05-31 08:29 58631.堆结点 package boke.heap1; /* ... -
Java插入排序代码整理
2010-05-28 14:44 1261package boke.sort; /** * 插 ... -
Java选择排序代码整理
2010-05-28 14:37 1519package boke.sort; /** * 选 ... -
Java冒泡排序代码整理
2010-05-28 14:26 1983Java冒泡排序代码整理: package boke.sor ...
相关推荐
【最大公因数】是指在两个或多个整数之间共享的约数中最大的一个。它是数学中的基础概念,尤其在数论和代数领域中有着广泛的应用。在小学数学教育阶段,最大公因数(Greatest Common Divisor,简称GCD)是孩子们需要...
例如,学生可以选择自己喜欢的方法来计算一些给定的数的最大公因数,然后与小组成员讨论和分享结果。 规律性 通过实践活动,学生可以发现一些规律性,例如,某些数的最大公因数总是相同的等。这些规律性可以帮助...
最大公因数(Greatest Common Divisor,GCD),又称为最大公约数,是数学中的一个基础概念,特别是在小学和初等数学教育中占据重要地位。这个概念在解决实际问题和理论探究中都有广泛的应用,比如简化分数、整数除法...
4. 质因数分解法:先对两个数进行质因数分解,然后取所有公共质因数的乘积,得到最大公约数。这种方法适用于理解数的结构,但在实际计算中不如前面的方法高效。 压缩文件列表中的"zuidagongyueshu"系列文件可能是用...
在数学学习的过程中,“公因数和最大公因数”是基础概念之一,它们是探究整数除法特性的关键。学习这些概念对于学生理解数学的除法运算、因数关系以及分数等知识都具有重要意义。而本文则聚焦于公因数和最大公因数的...
学生可以和同学讨论,分享不同的方法来求两个数的最大公因数。 第五页:方法三:先写出一个数的因数,再看另一个数的因数中哪些是第一个数的因数,找到最大的那个。例如,27的因数是1、3、9、27;18的因数是1、2、3...
在小学五年级数学下册的学习中,3.4单元主要探讨了因数与倍数的概念,特别是公因数和最大公因数这两个重要的数学概念。这个教学反思旨在深入剖析教学过程中可能遇到的问题以及如何改进教学策略,以促进学生对这些...
2. **计算最大公约数(Greatest Common Divisor, GCD)**:在数论中,两个或多个整数共有的最大正因数称为它们的最大公约数。常用的方法有欧几里得算法,也称为辗转相除法,通过不断用较大数除以较小数,再用除数与...
这篇资料主要涵盖了人教版小学五年级数学下册期末复习的重点知识,主要涉及了最大公因数(GCD)和最小公倍数(LCM)的概念及其应用。以下是相关知识点的详细说明: 1. **最大公因数**:指的是两个或多个整数共有...
这些练习旨在深化对最大公因数的理解,并检验学生是否能独立应用所学知识。 通过这堂课,学生应能掌握以下知识点: 1. 计算和列举一个数的所有因数。 2. 理解公因数的定义,并能找出两个数的公因数。 3. 了解最大...
第63例 最大公约数七段显示器编码 第64例 交通灯控制器 第65例 空调系统有限状态自动机 第66例 FIR滤波器 第67例 五阶椭圆滤波器 第68例 闹钟系统的控制 第69例 闹钟系统的译码 第70例 闹钟系统的移位寄存器 第71例 ...
RSA加密算法的安全性基于大数分解的难度,而计算模逆元和寻找大数的质因数都需要用到最大公约数的计算,因此欧几里得算法是不可或缺的工具。 再者,欧几里得算法在计算机图形学中也有应用,比如在计算几何中,可以...
例如,短除法在找最大公因数时的应用,通过多媒体演示可以更加清晰地展示每一步的运算过程,使学生能够更快速地掌握这种解题技巧。 通过这一系列的教学活动,学生不仅能够学会如何找出两个数的公因数和最大公因数,...
让学生从“找因数-找公因数-找最大公因数-短除法”过渡到“找倍数-找公倍数-找最小公倍数-短除法”,利用已有的知识基础,促进新知识的理解。 3. **最小公倍数**:在例1中,教师需指导学生理解如何使用短除法求两个...
- 倍数与约数:了解整数的倍数和约数关系,以及公倍数和公约数的概念,包括最小公倍数和最大公约数。 - 质数与合数:质数是只有1和其本身两个正约数的自然数,合数则是有超过两个正约数的自然数。 - 互质数:两个...
本节课的目标十分明确,旨在引导学生在实际情境中理解公因数和最大公因数的意义,并能熟练求解两个数的最大公因数。在此基础上,通过一系列的数学活动,比如观察、猜想和归纳,来促进学生初步推理能力的发展。在剪纸...
- **公因数和最大公因数**:几个数共有的因数,最大的一个称为最大公因数。 - **公倍数和最小公倍数**:几个数共有的倍数,最小的一个称为最小公倍数。 - **奇数和偶数**:能被2整除的数是偶数,不能被2整除的数...
这种分解方式可以帮助简化复杂的代数表达式,对于解方程、求最大公约数、最小公倍数等问题十分有用。 在提公因式法中,首先要确定公因式,这通常是多项式各项系数的最大公约数以及各变量的最低次幂。例如,对于...
【描述】: "本文深入探讨了PLC(可编程逻辑控制器)的基础知识,包括其起源、发展以及与步进电机的配合使用,同时也分享了一些实用的PLC操作技巧。" 【标签】: "PLC 技巧" PLC,即可编程逻辑控制器,自1969年问世...
学生需要了解2、3、5的倍数特征,并学会找出100以内两个数的最大公因数和最小公倍数。 3. **体积与容积**: - 学习体积和容积的概念及其度量单位,如立方米、立方分米、立方厘米等。学生需要掌握如何进行单位间的...