JAVA算法题目集合 联系客服

发布时间 : 星期一 文章JAVA算法题目集合更新完毕开始阅读7fd4b427b4daa58da1114a05

5.构造 4行、4列的拉丁方阵,使方阵中的每一行和每一列中数字1到4只出现一次。 4阶拉丁方阵见如下: 1 2 3 4 2 3 4 1 3 4 1 2 4 1 2 3

构造拉丁方阵的方法很多,这里给出最简单的一种方法。观察给出的例子,可以发现:若将每一行中第一列的数字和最后一列的数字连起来构成一个环,则该环正好是由1到4顺序构成;对于第i行,这个环的开始数字为i。按照此规律可以很容易的写出程序。

思路:(1)赋值(组合) (4*4) (2) 判断 (每一行判断)

6.在直角三角形中,两个直角边的平方和等于斜边的平方,也就是非常著名的“勾股定理”,那么这100以内的数字中,就存在着这样的一些数,比如:3,4,5,3的平方加上4的平方等于5的平方,这三个数就可以组成一个直角三角形。 现在我们要求出这些数(要求相同度数的直角三角形的三条边使用最小值,比如:6,8,10就要变成3,4,5)。

首先设法得到从3到100之间的数的两组合。利用二重循环可以达到这一目的。令外循环变量为A,A从1到99。令内循环的循环变量为B,B从A+1到100。然后在循环体内判断A和B是否满足等式(1)。

将满足等式的A和B及C打印出来。为了缩短机器运算时间,我们可以利用勾股数的奇偶特性。即在A和B中一个是奇数,另一个必定是偶数。那么可以让B从A+1开始,每次增加步长为2。因为A若是奇数,A+1就是偶数。以后步长是2,B总是为偶数。如果A是偶数,A+1就是奇数。以后步长是2,B总为奇数。我们用整型变量\循环变量1\、\循环变量2\、\变量\分别代表A、B、C。

7.随机取一定范围内的指定数量不重复数,比如从1-100中随机取30个不重复数字。

使用排除法,先初始化范围,然后放到一个数组中,取出一个后,将这个位置的内容删除,那么下次就不会再重复取了,随机取的不是数字,而是位置。

8奶牛问题:

一个农场有头母牛,现在母牛才一岁,要到四岁才能生小牛,四岁之后,每年生一头小牛。假设每次生的都是母牛,并且也遵守4年才生育并生母牛的原则,并且无死亡,问: N年后共有多少头牛?

1,2,4,8,16…..

9.

美丽的莱茵河畔,每边都分布着5个城市,两边的城市都是唯一对应的友好城市,现需要在友好城市开通航线以加强往来。

但因为莱茵河常年大雾,如果开设的航线发生交叉现象就有可能出现碰船的现象。现在要求近可能多地开通航线并且使航线不能相交! 求出最多能开通的航线数和城市? 分析:

用一个数组来存放对应的友好城市的代码和友好城市的对数,然后在规划时先从倒数第二个城市开始,找出可以设置的航线条数和下一条航线开始的城市。

如果正在规划的城市的航线数大于已知的航线条数,则存储这个航线条数和城市的代码,这样一直找下去,把最多的航线数都找出来,最后把最多的航线数和对应的友好城市显示出来。

10:任意给出从1到N的一个自然数,求出这N个自然数的各种全排列。如N=3时,共有以下6种排列方式:123,132,213,231,312,321。

应用回溯法,每个数的取法都有N个方向(1——N),当取够N个数时,输出一个排列,然后退后一步,取前一个数的下一个方向(即前一个数+1),并且要保证所有数字不能重复。当前数字的所有方向都取完时,继续退一步,一直重复到第一个数为止。

public class AllShunXu {

static void sort(int index) {

int i;

if (index == n) { }

for (i = index; i < n; i++) {

for (i = 0; i < n; i++) { }

System.out.println(\); return;

System.out.print(a[i]);

static void swap(int arg1, int arg2) { }

char temp; temp = a[arg1]; a[arg1] = a[arg2]; a[arg2] = temp;

static String str = \;

static char[] a = str.toCharArray(); static int n = 5;

}

}

}

swap(index, i); sort(index + 1); swap(index, i);

public static void main(String args[]) { }

for (int s = 0; s < n; s++) { }

sort(s);

package com.syj.csdn;

import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** *

* Title:全排列算法 *

* *

* Copyright: http://blog.csdn.net/sunyujia/ *

*

* @author 孙钰佳

* @main sunyujia@yahoo.cn * @date 2009-04-25 23:57:23 PM */

public class FullSort {

//将NUM设置为待排列数组的长度即实现全排列 private static int NUM = 3;

/**

* 递归算法:将数据分为两部分,递归将数据从左侧移右侧实现全排列 *

* @param datas * @param target */

private static void sort(List datas, List target) {

if (target.size() == NUM) { for (Object obj : target) System.out.print(obj); System.out.println(); return; }

for (int i = 0; i < datas.size(); i++) {

List newDatas = new ArrayList(datas); List newTarget = new ArrayList(target); newTarget.add(newDatas.get(i)); newDatas.remove(i);

sort(newDatas, newTarget); } }

public static void main(String[] args) {

String[] datas = new String[] { \ sort(Arrays.asList(datas), new ArrayList()); } } 11:

小明有五本新书,要借给A,B,C三位小朋友,若每人每次只能借一本,则可以有多少种不同的借法?(对五本书进行编号,分别为1,2,3,4,5)

本问题实际上是一个排列问题,即求从5个中取3个进行排列的方法的总数。首先对五本书从1至5进行编号,然后使用穷举的方法。

假设三个人分别借这五本书中的一本,当三个人所借的书的编号都不相同时,就是满足题意的一种借阅方法。

12:在直角三角形中,两个直角边的平方和等于斜边的平方,也就是非常著名的“勾股定理”,那么这100以内的数字中,就存在着这样的一些数,比如:3,4,5,3的平方加上4的平方等于5的平方,这三个数就可以组成一个直角三角形。 现在我们要求出这些数(要求相同度数的直角三角形的三条边使用最小值,比如:6,8,10就要变成3,4,5)。

首先设法得到从3到100之间的数的两组合。利用二重循环可以达到这一目的。令外循环变量为A,A从1到99。令内循环的循环变量为B,B从A+1到100。然后在循环体内判断A和B是否满足等式(1)。