Java经典算法大全

Java经典算法大全
Java经典算法大全

Java经典问题算法大全

/*【程序1】

题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?

1.程序分析:兔子的规律为数列1,1,2,3,5,8,13,21....

*/

package https://www.360docs.net/doc/0e19074319.html,.flywater.FiftyAlgorthm;

public class FirstRabbit {

public static final int MONTH = 15;

public static vo id main(String[] args) {

long f1 = 1L, f2 = 1L;

long f;

for(int i=3; i

f = f2;

f2 = f1 + f2;

f1 = f;

System.out.print("第" + i +"个月的兔子对数: ");

System.out.println(" " + f2);

}

}

}

/*【程序2】

* 作者若水飞天

题目:判断101-200之间有多少个素数,并输出所有素数。

1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,

则表明此数不是素数,反之是素数。*/

package https://www.360docs.net/doc/0e19074319.html,.flywater.FiftyAlgorthm;

public class SecondPrimeNumber {

public static int count = 0;

public static void main(String[] args) {

for(int i=101;i<200;i++){

boolean b = true;//默认此数就素数

for(int j=2;j<=Math.sqrt(i);j++){

if(i%j==0){

b = false; //此数不是素数

break;

}

}

if(b){

count++;

System.out.print(i+" ");

}

}

System.out.println("\n素数的个数:"+count);

}

}

/*【程序3】

作者若水飞天

题目:打印出所有的"水仙花数(narcissus number)",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。

1.程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。*/ package https://www.360docs.net/doc/0e19074319.html,.flywater.FiftyAlgorthm;

public class ThirdNarcissusNum {

static int b, bb, bbb;

public static void main(String[] args) {

for(int num=101; num<1000; num++) {

ThirdNarcissusNum tnn = new ThirdNarcissusNum();

tnn.f(num);

}

}

public void f(int m) {

bbb = m / 100;

bb = (m % 100) / 10;

b = (m % 100) % 10;

if((bbb * bbb * bbb + bb * bb * bb + b * b * b) == m) {

System.out.println(m);

}

}

}

/*【程序4】

作者若水飞天

题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。

程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:

(1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。

(2)如果n>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,重复执行第一步。

(3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。*/

package https://www.360docs.net/doc/0e19074319.html,.flywater.FiftyAlgorthm;

import java.util.Scanner;

public class FourthPrimeFactor {

static int n, k = 2;

public static void main(String[] args) {

Scanner s = new Scanner(System.in);

n = s.nextInt();

System.out.print(n + "=" );

FourthPrimeFactor fpf = new FourthPrimeFactor();

fpf.f(n);

}

public void f(int n) {

while(k <= n) {

if(k == n) {

System.out.println(n);

break;

} else if(n > k && n % k == 0) {

System.out.print(k + "*");

n = n / k;

f(n);

break;

} else if(n > k && n % k != 0) {

k++;

f(n);

break;

}

}

}

}

/*【程序5】

作者若水飞天

题目:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。

1.程序分析:(a>b)?a:b这是条件运算符的基本例子。*/

package https://www.360docs.net/doc/0e19074319.html,.flywater.FiftyAlgorthm;

import java.util.Scanner;

public class FifthCondition {

//public static final int S1 = 90;

//public static final int S2 = 60;

static int grade;

public static void main(String[] args) {

Scanner str = new Scanner(System.in);

int s = str.nextInt();

FifthCondition fc = new FifthCondition();

grade = https://www.360docs.net/doc/0e19074319.html,pare(s);

if(grade == 1) {

System.out.print('A');

} else if(grade == 2) {

System.out.print('B');

} else {

System.out.println('C');

}

}

public int compare(int s) {

return s > 90 ? 1

: s > 60 ? 2

:3;

}

}

/*【程序6】

作者若水飞天

题目:输入两个正整数m和n,求其最大公约数和最小公倍数。

1.程序分析:利用辗除法。*/

/*

* 在循环中,只要除数不等于0,用较大数除以较小的数,将小的一个数作为下一轮循环的大数,取得的余数作为下一轮循环的较小的数,如此循环直到较小的数的值为0,返回

* 较大的数,此数即为最小公约数,最小公倍数为两数之积除以最小公倍数。

* */

package https://www.360docs.net/doc/0e19074319.html,.flywater.FiftyAlgorthm;

import java.util.Scanner;

public class SixthCommonDiviser {

public static void main(String[] args) {

int a, b;

Scanner s1 = new Scanner(System.in);

Scanner s2 = new Scanner(System.in);

a = s1.nextInt();

b = s2.nextInt();

SixthCommonDiviser scd = new SixthCommonDiviser();

int m = scd.division(a, b);

int n = a * b / m;

System.out.println("最大公约数: " + m);

System.out.println("最小公倍数: " + n);

}

public int division(int x, int y) {

int t;

if(x < y) {

t = x;

x = y;

y = t;

}

while(y != 0) {

if(x == y) return 1;

else {

int k = x % y;

x = y;

y = k;

}

}

return x;

}

}

/*【程序7】

作者若水飞天

题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。1.程序分析:利用while语句,条件为输入的字符不为'\n '. */

package https://www.360docs.net/doc/0e19074319.html,.flywater.FiftyAlgorthm;

import java.util.*;

public class SeventhCharacterStatistics {

static int digital = 0;

static int character = 0;

static int other = 0;

static int blank = 0;

public static void main(String[] args) {

char[] ch = null;

Scanner sc = new Scanner(System.in);

String s = sc.nextLine();

ch = s.toCharArray();

for(int i=0; i

if(ch[i] >= '0' && ch[i] <= '9') {

digital ++;

} else if((ch[i] >= 'a' && ch[i] <= 'z') || ch[i] > 'A' && ch[i] <= 'Z') { character ++;

} else if(ch[i] == ' ') {

blank ++;

} else {

other ++;

}

}

System.out.println("数字个数: " + digital);

System.out.println("英文字母个数: " + character);

System.out.println("空格个数: " + blank);

System.out.println("其他字符个数:" + other );

}

}

/*【程序8】

作者若水飞天

题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。

*/

/*

* 算法:定义一个变量b,赋初值为0;定义一变量sum,赋初值为0,

* 进入循环后,将a + b 的值赋给b,将sum + b 的值赋给sum;

* 同时,将a 增加十倍,++ i;继续循环;

* 循环结束后,输出sum 的值。

*/

package https://www.360docs.net/doc/0e19074319.html,.flywater.FiftyAlgorthm;

import java.util.Scanner;

public class EightPlus {

static long a = 2, b = 0;

public static void main(String[] args) {

Scanner s = new Scanner(System.in);

int n = s.nextInt();

int i = 0;

long sum = 0;

while(i < n) {

b = b + a;

sum = sum + b;

a = a * 10;

++ i;

}

System.out.println("input number: " + n);

System.out.println(sum);

}

}

/*【程序9】

题目:一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3.编程找出1000以内的所有完数。

*/

package https://www.360docs.net/doc/0e19074319.html,.flywater.FiftyAlgorthm;

public class NinthWanshu {

public static void main(String[] args) {

System.out.println("1到1000的完数有:");

for(int i=1; i<1000; i++) {

int t = 0;

for(int j=1; j<= i/2; j++) {

if(i % j == 0) {

t = t + j;

}

}

if(t == i) {

System.out.print(i + " ");

}

}

}

}

/*【程序10】

作者若水飞天

题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,

求它在第10次落地时,共经过多少米?第10次反弹多高?

*/

package https://www.360docs.net/doc/0e19074319.html,.flywater.FiftyAlgorthm;

public class TenthTreeFall {

static double height = 100;

static double distance = 100;

public static void main(String[] args) {

for(int i=1; i<10; i++) {

distance = distance + height;

height = height / 2;

}

System.out.println("路程:" + distance);

System.out.println("高度:" + height / 2);

}

}

/*【程序11】

* 作者若水飞天

题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?

1.程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去掉不满足条件的排列。

*/

/*算法:3个for循环加一个if语句;

*

*/

package https://www.360docs.net/doc/0e19074319.html,.flywater.FiftyAlgorthm;

public class EleventhNumberRange {

public static void main(String[] args) {

int count = 0;

for(int x=1; x<5; x++) {

for(int y=1; y<5; y++) {

for(int z=1; z<5; z++) {

if(x != y && y != z && x != z) {

count ++;

System.out.print(x*100 + y*10 + z + " ");

if(count % 4 == 0) {

System.out.println();

}

}

}

}

}

System.out.println("共有" + count + "个三位数");

}

}

/*【程序12】

* 作者若水飞天

题目:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;

利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%;20万到40万之间时,高于20万元的部分,

可提成5%;40万到60万之间时高于40万元的部分,可提成3%;

60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,

从键盘输入当月利润I,求应发放奖金总数?

1.程序分析:请利用数轴来分界,定位。注意定义时需把奖金定义成长整型。

*/

/*注意:要精确到小数点后多少位,用DecimalFormat df = new DecimalFormat("#0.0000");

*

*/

package https://www.360docs.net/doc/0e19074319.html,.flywater.FiftyAlgorthm;

import java.text.DecimalFormat;

import java.util.*;

public class TwelfthProfitAward {

static double profit = 0;

static double award = 0;

public static void main(String[] args) {

Scanner s = new Scanner(System.in);

profit = s.nextInt();

System.out.println("输入的利润是" + profit + "万");

if(profit > 0 && profit <= 10) {

award = profit * 0.1;

} else if(profit > 10 && profit <= 20) {

award = 10 * 0.1 + (profit - 10) * 0.075;

} else if(profit > 20 && profit <= 40) {

award = 10 * 0.1 + 10 * 0.075 + (profit - 20) * 0.05;

} else if(profit > 40 && profit <= 60) {

award = 10 * 0.1 + 10 * 0.075 + 20 * 0.05 + (profit - 40) * 0.03;

} else if(profit > 60 && profit <= 100) {

award = 20 * 0.175 + 20 * 0.05 + 20 * 0.03 + (profit - 60) * 0.015;

} else if(profit > 100) {

award = 20 * 0.175 + 40 * 0.08 + 40 * 0.015 + (profit - 100) * 0.01;

}

DecimalFormat df = new DecimalFormat("#0.00000");

System.out.println("应该提取的奖金是" + df.format(award) + "万");

}

}

/*【程序13】

* 作者若水飞天

题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?

1.程序分析:在10万以内判断,先将该数加上100后再开方,再将该数加上268后再开方,如果开方后的结果满足如下条件,即是结果。请看具体分析:

*/

package https://www.360docs.net/doc/0e19074319.html,.flywater.FiftyAlgorthm;

public class ThirteenthTwiceSqrt {

public static void main(String[] args) {

for(long l=1L; l<100000; l++) {

if(Math.sqrt((long)(l+100)) % 1 == 0) {

if(Math.sqrt((long)(l+268)) % 1 == 0) {

System.out.println(l + "加100是一个完全平方数,再加168又是一个完全平方数");

}

}

}

}

}

*【程序14】

* 作者若水飞天

题目:输入某年某月某日,判断这一天是这一年的第几天?

1.程序分析:以3月5日为例,应该先把前两个月的加起来,

然后再加上5天即本年的第几天,特殊情况,闰年且输入月份大于3时需考虑多加一天。

*/

package https://www.360docs.net/doc/0e19074319.html,.flywater.FiftyAlgorthm;

import java.util.Scanner;

import java.io.*;

public class FourteenthYearMonthDay {

public static void main(String[] args) {

int year, month, day;

int days = 0;

int d = 0;

FourteenthYearMonthDay fymd = new FourteenthYearMonthDay(); System.out.print("Input the year:");

year =fymd.input();

System.out.print("Input the month:");

month = fymd.input();

System.out.print("Input The Day:");

day = fymd.input();

if (year < 0 || month < 0 || month > 12 || day < 0 || day > 31) { System.out.println("Input error, please run this program again!"); System.exit(0);

}

for (int i=1; i

switch (i) {

case 1:

case 3:

case 5:

case 7:

case 8:

case 10:

case 12:

days = 31;

//d += days;

break;

case 4:

case 6:

case 9:

case 11:

days = 30;

//d += days;

break;

case 2:

if ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0)) { days = 29;

} else {

days = 28;

}

//d += days;

break;

}

d += days;

}

System.out.println(year + ":" + month + ":" + day + "是今年的第" + (d+day) + "天。");

}

public int input() {

int value = 0;

Scanner s = new Scanner(System.in);

value = s.nextInt();

return value;

}

}

/*【程序15】

* 作者若水飞天

题目:输入三个整数x,y,z,请把这三个数由小到大输出。

1.程序分析:我们想办法把最小的数放到x上,先将x与y进行比较,如果x> y则将x 与y的值进行交换,然后再用x与z进行比较,如果x> z则将x与z的值进行交换,这样能使x最小。

*/

package https://www.360docs.net/doc/0e19074319.html,.flywater.FiftyAlgorthm;

import java.util.*;

public class FifteenthNumberCompare {

public static void main(String[] args) {

FifteenthNumberCompare fnc = new FifteenthNumberCompare();

int a, b, c;

System.out.println("Input 3 numbers:");

a = fnc.input();

b = fnc.input();

c = fnc.input();

//

// https://www.360docs.net/doc/0e19074319.html,pare(a, b);//方法调用不能通过改变形参的值来改变实参的值

// https://www.360docs.net/doc/0e19074319.html,pare(b, c);// 这种做法是错的

// https://www.360docs.net/doc/0e19074319.html,pare(a, c);

//System.out.println("result:" + a +" " + b + " " + c);// 没有改变

if(a > b) {

int t = a;

a = b;

b = t;

}

if(a > c) {

int t = a;

a = c;

c = t;

}

if(b > c) {

int t = b;

b = c;

c = t;

}

System.out.println( a + " " + b + " " + c);

}

public int input() {

int value = 0;

Scanner s = new Scanner(System.in);

value = s.nextInt();

return value;

}

public void compare(int x, int y) {//此方法没用if(x > y) {

int t = x;

x = y;

y = t;

}

}

}

/*【程序16】

* 作者若水飞天

*题目:输出9*9口诀。

*1.程序分析:分行与列考虑,共9行9列,i控制行,j控制列。**/

package https://www.360docs.net/doc/0e19074319.html,.flywater.FiftyAlgorthm;

public class SixteenthMultiplicationTable {

public static void main(String[] args) {

for(int i=1; i<10; i++) {

for(int j=1; j<=i; j++) {

System.out.print(j + "*" + i + "=" + j*i + " " );

}

System.out.println();

}

}

}

//【程序17】

//作者若水飞天

//题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,

//又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。

//以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,

//见只剩下一个桃子了。求第一天共摘了多少。

//1.程序分析:采取逆向思维的方法,从后往前推断。

package https://www.360docs.net/doc/0e19074319.html,.flywater.FiftyAlgorthm;

public class SeventeenthMonkeyPeach {

public static void main(String[] args) {

int lastdayNum = 1;

for(int i=2; i<=10; i++) {

lastdayNum = (lastdayNum+1) * 2;

}

System.out.println("猴子第一天摘了" + lastdayNum + " 个桃子");

}

}

/*【程序18】

* 作者若水飞天

题目:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。

已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。

*/

/*

* 这个程序写得很不好,是知道结果后拼凑起来的,还不如直接写输出语句加上结果来的好。

*/

package https://www.360docs.net/doc/0e19074319.html,.flywater.FiftyAlgorthm;

public class EighteenthPingpong {

static char[] m = { 'a', 'b', 'c' };

static char[] n = { 'x', 'y', 'z' };

public static void main(String[] args) {

for (int i = 0; i < m.length; i++) {

for (int j = 0; j < n.length; j++) {

if (m[i] == 'a' && n[j] == 'x') {

continue;

} else if (m[i] == 'a' && n[j] == 'y') {

continue;

} else if ((m[i] == 'c' && n[j] == 'x')

|| (m[i] == 'c' && n[j] == 'z')) {

continue;

} else if ((m[i] == 'b' && n[j] == 'z')

|| (m[i] == 'b' && n[j] == 'y')) {

continue;

} else

System.out.println(m[i] + " vs " + n[j]);

}

}

}

}

题目:打印出如下图案(菱形)

*

***

*****

*******

*****

***

*

1.程序分析:先把图形分成两部分来看待,前四行一个规律,后三行一个规律,利用双重for 循环,

第一层控制行,第二层控制列。

*/

/*上半部分循环变量的控制方法是

* for(int i=0; i<(HEIGHT+1) / 2; i++) {

for(int j=1; j

for(int k=1; k<(i+1)*2; k++) {

下半部分循环变量的控制方法是

for(int i=1; i<=HEIGHT/2; i++) {

for(int j=1; j<=i; j++) {

* for(int k=1; k<=WIDTH-2*i-1; k++) {

*/

package https://www.360docs.net/doc/0e19074319.html,.flywater.FiftyAlgorthm;

public class NineteenthPrintRhombic {

static final int HEIGHT = 7;

static final int WIDTH = 8;

public static void main(String[] args) {

for(int i=0; i<(HEIGHT+1) / 2; i++) {

for(int j=1; j

System.out.print(" ");

}

for(int k=1; k<(i+1)*2; k++) {

System.out.print('*');

}

System.out.println();

}

for(int i=1; i<=HEIGHT/2; i++) {

for(int j=1; j<=i; j++) {

System.out.print(" ");

}

for(int k=1; k<=WIDTH-2*i-1; k++) {

System.out.print('*');

}

System.out.println();

}

}

}

上半部分第二重循环应改为:for(int j=0; j

上半部分第三重循环应改为:for(int k=1; k<=WIDTH-2*i; k++)

/*【程序20】

* 作者若水飞天

题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。

1.程序分析:请抓住分子与分母的变化规律。

*/

package https://www.360docs.net/doc/0e19074319.html,.flywater.FiftyAlgorthm;

import java.text.DecimalFormat;

public class TwentiethFractionSum {

public static void main(String[] args) {

int x = 2, y = 1, t;

double sum = 0;

DecimalFormat df = new DecimalFormat("#0.0000");

for(int i=1; i<=20; i++) {

sum += (double)x / y;

t = y;

y = x;

x = y + t;

System.out.println("第" + i + " 次相加,和是" + df.format(sum));

}

}

/*【程序21】

* 作者若水飞天

题目:求1+2!+3!+...+20!的和

1.程序分析:此程序只是把累加变成了累乘。

*/

package https://www.360docs.net/doc/0e19074319.html,.flywater.FiftyAlgorthm;

public class Twenty_firstFactorialSum {

static long sum = 0;

static long fac = 0;

public static void main(String[] args) {

long sum = 0;

long fac = 1;

for(int i=1; i<=10; i++) {

fac = fac * i;

sum += fac;

}

System.out.println(sum);

}

}

/*【程序22】

* 作者若水飞天

题目:利用递归方法求5!。

1.程序分析:递归公式:fn=fn_1*4!

*/

package https://www.360docs.net/doc/0e19074319.html,.flywater.FiftyAlgorthm;

import java.util.Scanner;

public class Twenty_secondFactorialRecursion {

public static void main(String[] args) {

Scanner s = new Scanner(System.in);

int n = s.nextInt();

Twenty_secondFactorialRecursion tfr = new Twenty_secondFactorialRecursion();

System.out.println(tfr.recursion(n));

}

public long recursion(int n) {

long value = 0 ;

if(n ==1 || n == 0) {

value = 1;

} else if(n > 1) {

value = n * recursion(n-1);

}

return value;

}

}

/*【程序23】

* 作者:若水飞天

题目:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。

问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。

问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?1.程序分析:利用递归的方法,递归分为回推和递推两个阶段。

要想知道第五个人岁数,需知道第四人的岁数,依次类推,推到第一人(10岁),再往回推。**/

package https://www.360docs.net/doc/0e19074319.html,.flywater.FiftyAlgorthm;

public class Twenty_thirdPeopleAge {

public static void main(String[] args) {

int age = 10;

for(int i=2; i<=5; i++) {

age += 2;

}

System.out.println(age);

}

}

/*【程序24】

* 作者若水飞天

题目:给一个不多于5位的正整数,

要求:一、求它是几位数,二、逆序打印出各位数字。

说明:这个算法实现虽然实现了这个功能,但不健壮,当输入字符是,会出现异常。*/

package https://www.360docs.net/doc/0e19074319.html,.flywater.FiftyAlgorthm;

import java.util.Scanner;

public class Twenty_fourthNumber {

public static void main(String[] args) {

Twenty_fourthNumber tn = new Twenty_fourthNumber();

Scanner s = new Scanner(System.in);

long a = s.nextLong();

if(a < 0 || a > 100000) {

System.out.println("Error Input, please run this program Again");

System.exit(0);

}

if(a >=0 && a <=9) {

System.out.println( a + "是一位数");

System.out.println("按逆序输出是" + '\n' + a);

} else if(a >= 10 && a <= 99) {

System.out.println(a + "是二位数");

System.out.println("按逆序输出是" );

tn.converse(a);

} else if(a >= 100 && a <= 999) {

System.out.println(a + "是三位数");

System.out.println("按逆序输出是" );

tn.converse(a);

} else if(a >= 1000 && a <= 9999) {

System.out.println(a + "是四位数");

System.out.println("按逆序输出是" );

tn.converse(a);

} else if(a >= 10000 && a <= 99999) {

System.out.println(a + "是五位数");

System.out.println("按逆序输出是" );

tn.converse(a);

}

}

public void converse(long l) {

String s = Long.toString(l);

char[] ch = s.toCharArray();

for(int i=ch.length-1; i>=0; i--) {

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

}

}

}

这个算法实在太土了,也许只有我若水飞天才会这样写,

下面写一个优雅一点的

import java.util.Scanner;

public class Twenty_fourthNumber {

public static void main(String[] args) {

Twenty_fourthNumber tn = new Twenty_fourthNumber();

Scanner s = new Scanner(System.in);

long a = s.nextLong();

String s = Long.toString(l);

char[] ch = s.toCharArray();

System.out.println(a + "是" + ch.length + “位数”);

for(int i=ch.length-1; i>=0; i--) {

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

}

}

}

/*【程序25】

* 作者若水飞天

题目:一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。

**/

package https://www.360docs.net/doc/0e19074319.html,.flywater.FiftyAlgorthm;

import java.util.Scanner;

public class Twenty_fifthPalindrom {

static int[] a = new int[5];

static int[] b = new int[5];

public static void main(String[] args) {

boolean is =false;

Scanner s = new Scanner(System.in);

long l = s.nextLong();

if (l > 99999 || l < 10000) {

System.out.println("Input error, please input again!");

l = s.nextLong();

}

for (int i = 4; i >= 0; i--) {

a[i] = (int) (l / (long) Math.pow(10, i));

l =(l % ( long) Math.pow(10, i));

}

System.out.println();

for(int i=0,j=0; i<5; i++, j++) {

b[j] = a[i];

}

for(int i=0,j=4; i<5; i++, j--) {

if(a[i] != b[j]) {

is = false;

break;

} else {

is = true;

}

}

if(is == false) {

System.out.println("is not a Palindrom!");

} else if(is == true) {

System.out.println("is a Palindrom!");

}

}

}

这个更好,不限位数

public static void main(String[] args) {

Scanner s = new Scanner(System.in);

System.out.print("请输入一个正整数:");

long a = s.nextLong();

String ss = Long.toString(a);

char[] ch = ss.toCharArray();

boolean is =true;

int j=ch.length;

for(int i=0; i

if(ch[i]!=ch[j-i-1]){is=false;}

}

if(is==true){System.out.println("这是一个回文数");}

else {System.out.println("这不是一个回文数");}

}

/*【程序26】

* 作者若水飞天

题目:请输入星期几的第一个字母来判断一下是星期几,

如果第一个字母一样,则继续判断第二个字母。

1.程序分析:用情况语句比较好,如果第一个字母一样,

则判断用情况语句或if语句判断第二个字母。

此程序虽然实现了基本功能,但必须严格按照题目的要求输入,否则程序无法执行**/

package https://www.360docs.net/doc/0e19074319.html,.flywater.FiftyAlgorthm;

import java.util.Scanner;

public class Twenty_sixthWeek {

Scanner s = new Scanner(System.in);

public static void main(String[] args) {

Twenty_sixthWeek tw = new Twenty_sixthWeek();

char ch = tw.getChar();

switch(ch) {

case 'M':

System.out.println("Monday");

break;

case 'W':

System.out.println("Wednesday");

break;

case 'F':

System.out.println("Friday");

break;

case 'T': {

System.out.println("please input the second letter!");

char ch2 = tw.getChar();

if(ch2 == 'U') {System.out.println("Tuesday"); }

else if(ch2 == 'H') {System.out.println("Thursday"); }

};

break;

case 'S': {

System.out.println("please input the scecond letter!");

char ch2 = tw.getChar();

if(ch2 == 'U') {System.out.println("Sunday"); }

JAVA经典算法案例

JA V A经典算法40例 【程序1】题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析:兔子的规律为数列1,1,2,3,5,8,13,21.... public class exp2{ public static void main(String args[]){ int i=0; for(i=1;i<=20;i++) System.out.println(f(i)); } public static int f(int x) { if(x==1 || x==2) return 1; else return f(x-1)+f(x-2); } } 或 public class exp2{ public static void main(String args[]){ int i=0; math mymath = new math(); for(i=1;i<=20;i++) System.out.println(mymath.f(i)); } } class math { public int f(int x) { if(x==1 || x==2) return 1; else return f(x-1)+f(x-2); } } 【程序2】题目:判断101-200之间有多少个素数,并输出所有素数。 1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除, 则表明此数不是素数,反之是素数。 public class exp2{ public static void main(String args[]){ int i=0; math mymath = new math(); for(i=2;i<=200;i++) if(mymath.iszhishu(i)==true) System.out.println(i); } } class math { public boolean iszhishu(int x) { for(int i=2;i<=x/2;i++) if (x % i==0 ) return false; return true; } } 【程序3】题目:打印出所有的"水仙花数",所谓"水仙花数 "是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个"水

Java经典算法大全

Java经典问题算法大全 /*【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析:兔子的规律为数列1,1,2,3,5,8,13,21.... */ package https://www.360docs.net/doc/0e19074319.html,.flywater.FiftyAlgorthm; public class FirstRabbit { public static final int MONTH = 15; public static vo id main(String[] args) { long f1 = 1L, f2 = 1L; long f; for(int i=3; i

JAVA算法100例_全源码

JA V A经典算法40题 【程序1】题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析:兔子的规律为数列1,1,2,3,5,8,13,21.... public class exp2{ public static void main(String args[]){ int i=0; for(i=1;i<=20;i++) System.out.println(f(i)); } public static int f(int x) { if(x==1 || x==2) return 1; else return f(x-1)+f(x-2); } } 或 public class exp2{ public static void main(String args[]){ int i=0; math mymath = new math(); for(i=1;i<=20;i++) System.out.println(mymath.f(i)); } } class math { public int f(int x) { if(x==1 || x==2) return 1; else return f(x-1)+f(x-2); } } 【程序2】题目:判断101-200之间有多少个素数,并输出所有素数。 1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除, 则表明此数不是素数,反之是素数。 public class exp2{ public static void main(String args[]){ int i=0; math mymath = new math(); for(i=2;i<=200;i++) if(mymath.iszhishu(i)==true) System.out.println(i); } } class math { public int f(int x) { if(x==1 || x==2) return 1; else return f(x-1)+f(x-2); } public boolean iszhishu(int x) { for(int i=2;i<=x/2;i++) if (x % 2==0 ) return false; return true;

协同过滤推荐算法(java原生JDK实现-附源码地址)

协同过滤推荐算法(java原生JDK实现-附源 码地址) 一、项目需求 1.需求链接 https://https://www.360docs.net/doc/0e19074319.html,/getStart/information.htm?raceId=231522 2.需求内容 训练数据包含了抽样出来的一定量用户在一个月时间(11.18~12.18)之内的移动端行为数据(D),评分数据是这些用户在这个一个月之后的一天(12.19)

对商品子集(P)的购买数据。参赛者要使用训练数据建立推荐模型,并输出用户在接下来一天对商品子集购买行为的预测结果。 评分数据格式 具体计算公式如下:参赛者完成用户对商品子集的购买预测之后,需要将结果放入指定格式的数据表(非分区表)中,要求结果表名为:tianchi_mobile_recommendation_predict.csv,且以utf-8格式编码;包含user_id 和item_id两列(均为string类型),要求去除重复。例如: 评估指标 比赛采用经典的精确度(precision)、召回率(recall)和F1值作为评估指标。具体计算公式如下: 其中PredictionSet为算法预测的购买数据集合,ReferenceSet为真实的答案购买数据集合。我们以F1值作为最终的唯一评测标准。 二、协同过滤推荐算法原理及实现流程 1.基于用户的协同过滤推荐算法 基于用户的协同过滤推荐算法通过寻找与目标用户具有相似评分的邻居用户,通过查找邻居用户喜欢的项目,推测目标用户也具有相同的喜好。基于用户的协同过滤推荐算法基本思想是:根据用户-项目评分矩阵查找当前用户的最近邻居,利用最近邻居的评分来预测当前用户对项目的预测值,将评分最高的N 个项目推荐给用户,其中的项目可理解为系统处理的商品。其算法流程图如下图1所示。

java实现图论中的经典算法

1.最短路的笛杰斯特拉算法 /** * * @author Administrator */ //这个算法用来解决无向图中任意两点的最短路径,同时输出路径(起点到所有点的) public class MinPath { public static String dijkstra(int[][] W1, int start, int end) { System.out.println("起点:" + start + "终点:" + end); boolean[] isLabel = new boolean[W1[0].length];// 是否标号 int[] indexs = new int[W1[0].length];// 所有标号的点的下标集合,以标号的先后顺序进行存储,实际上是一个以数组表示的栈 int i_count = -1;// 栈的顶点 int[] distance = W1[start].clone();// v0到各点的最短距离的初始值 int index = start;// 从初始点开始 int presentShortest = 0;// 当前临时最短距离 indexs[++i_count] = index;// 把已经标号的下标存入下标集中 isLabel[index] = true; while (i_count < W1[0].length) { // 第一步:得到与原点最近的某个点 int min = Integer.MAX_V ALUE; for (int i = 0; i < distance.length; i++) { if (!isLabel[i] && distance[i] != -1 && i != index) { // 如果到这个点有边,并且没有被标号 if (distance[i] < min) { min = distance[i]; index = i;// 把下标改为当前下标 } } } i_count = i_count + 1; if (i_count == W1[0].length) { break; } isLabel[index] = true;// 对点进行标号 indexs[i_count] = index;// 把已经标号的下标存入下标集中 if (W1[indexs[i_count - 1]][index] == -1 || presentShortest + W1[indexs[i_count - 1]][index] > distance[index]) { // 如果两个点没有直接相连,或者两个点的路径大于最短路径 presentShortest = distance[index]; } else { presentShortest += W1[indexs[i_count - 1]][index];

JAVA经典算法

河内塔问题(Towers of Hanoi) 问题说明: 河內之塔(Towers of Hanoi)是法国人M.Claus(Lucas)於1883年从泰国带至法国的,河內为越战时北越的首都,即现在的胡志明市;1883年法国数学家 Edouard Lucas曾提及這个故事,据说创世紀时Benares有一座波罗教塔,是由三支钻石棒(Pag)所支撑,开始时神在第一根棒上放置64个由上至下依由小至大排列的金盘(Disc),並命令僧侣将所有的金盘从第一根石棒移至第三根石棒,且搬运过程中遵守大盘子在小盘子之下的原则,若每日仅搬一个盘子,则当盘子全数搬运完毕之时,此塔将损毁,而也就是世界末日來临之时。 算法代码(Java): 复制内容到剪贴板 import java.io.*; public class Hanoi { public static void main(String args[]) throws IOException { int n; BufferedReader buf; buf = new BufferedReader(new InputStreamReader(System.in)); System.out.print("请输入盘子个数"); n = Integer.parseInt(buf.readLine()); Hanoi hanoi = new Hanoi(); hanoi.move(n, 'A', 'B', 'C'); } public void move(int n, char a, char b, char c) { if(n == 1) System.out.println("盘 " + n + " 由 " + a + " 移至 " + c); else { move(n - 1, a, c, b); System.out.println("盘 " + n + " 由 " + a + " 移至 " + c); move(n - 1, b, a, c);

java程序员必知的十种程序算法

java程序员必学的十种程序算法 算法1:快速排序算法 快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。 快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。 算法步骤: 1 从数列中挑出一个元素,称为“基准”(pivot),

2 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。 3 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。 递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会退出,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。 算法2:堆排序算法

堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。 堆排序的平均时间复杂度为Ο(nlogn) 。 算法步骤: 创建一个堆H[0..n-1] 把堆首(最大值)和堆尾互换 3. 把堆的尺寸缩小1,并调用shift_down(0),目的是把新的数组顶端数据调整到相应位置 4. 重复步骤2,直到堆的尺寸为1 算法3:归并排序 归并排序(Merge sort,台湾译作:合并排序)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。 算法步骤:

JAVA经典算法40题

JAVA经典算法40题 【程序1】题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析:兔子的规律为数列1,1,2,3,5,8,13,21.... public class exp2{ public static void main(String args[]){ int i=0; for(i=1;i<=20;i++) System.out.println(f(i)); } public static int f(int x) { if(x==1 || x==2) return 1; else return f(x-1)+f(x-2); } } 或 public class exp2{ public static void main(String args[]){ int i=0; math mymath = new math(); for(i=1;i<=20;i++) System.out.println(mymath.f(i)); } } class math { public int f(int x) { if(x==1 || x==2) return 1; else return f(x-1)+f(x-2); } } 【程序2】题目:判断101-200之间有多少个素数,并输出所有素数。 1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除, 则表明此数不是素数,反之是素数。 public class exp2{ public static void main(String args[]){ int i=0; math mymath = new math(); for(i=2;i<=200;i++)

Java数据结构与经典算法——高手必会

1.大O表示法:粗略的量度方法即算法的速度是如何与数据项的个数相关的 算法大O表示法表示的运行时间 线性查找 O(N) 二分查找 O(logN) 无序数组的插入 O(1) 有序数组的插入 O(N) 无序数组的删除 O(N) 有序数组的删除 O(N) O(1)是最优秀的,O(logN)良好,O(N)还可以,O(N2)稍差(在冒泡法中见到) 2.排序 public class JWzw { //插入排序 public void insertArray(Integer []in){ int tem = 0; int num = 0; int upnum = 0; for (int i = 0; i < in.length; i++) { for (int j = i - 1; j >= 0; j--) { num++; if (in[j+1] < in[j]) { tem = in[j+1]; in[j+1] = in[j]; in[j] = tem; upnum++; } else { break; } } } for (int i = 0; i < in.length; i++) { System.out.print(in[i]); if(i < in.length - 1) { System.out.print(",");

} } System.out.println(); System.out.println("插入排序循环次数:" + num); System.out.println("移动次数:" + upnum); System.out.print("\n\n\n"); } //选择排序 public void chooseArray(Integer []in){ int tem = 0; int num = 0; int upnum = 0; for(int i = 0;i < in.length;i++) { for(int j = i;j < in.length - 1;j++){ num++; if(in[j+1] < in[j]){ tem = in[j+1]; in[j + 1] = in[j]; in[j] = tem; upnum++; } } } for (int i = 0; i < in.length; i++) { System.out.print(in[i]); if(i < in.length - 1) { System.out.print(","); } } System.out.println(); System.out.println("选择排序循环次数:" + num); System.out.println("移动次数:" + upnum); System.out.print("\n\n\n"); } //冒泡排序 public void efferArray(Integer []in){ int tem = 0; int num = 0; int upnum = 0;

JAVA经典算法50题

【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析:兔子的规律为数列1,1,2,3,5,8,13,21.... public static void main(String[]args) { Scanner sc=new Scanner(System.in); System.out.println("请输入月数:"); int month=sc.nextInt(); int a=0,b=1,i,t; for(i=2;i<=month;i++) { t=b; b=a+b; a=t; } System.out.println("第"+month+"个月有"+b+"对兔子!"); } 【程序2】 题目:判断101-200之间有多少个素数,并输出所有素数。 1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除, 则表明此数不是素数,反之是素数。 public static void main(String args[]) { int i,n,flag; for(n=101;n<200;n++) { flag=0; for(i=2;i

public static void main(String[]args)throws Exception { int i,j,count=0; for(i=101;i<200;i++) { for(j=2;j<(int)(Math.sqrt(i)+1);j++) { if(i%j==0) break; } if(j>(int)Math.sqrt(i)) { System.out.println(i); count++; } } System.out.println("201到200之间共有"+count+"个素数!"); } 【程序3】 题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。 1.程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。public static void main(String args[]) { int a,b,c; int n; for(n=100;n<1000;n++) { a=n/100; b=(n-a*100)/10; c=n%10; if(n==a*a*a+b*b*b+c*c*c) { System.out.println(n); } } } 【程序4】 题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。 程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成: (1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。 (2)如果n<>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,重复执行第一步。

java经典算法50题答案

1 package work; public class Fib { public static void main(String[] args){ int[] fib = new int[23]; fib[0] = 1; fib[1] = 1; for(int i = 2; i < fib.length; i++){ fib[i] = fib[i - 1] + fib[i - 2]; } for(int i = 0; i < fib.length; i++){ System.out.print(fib[i]+" "); } } } 2 package work; import java.math.*; import java.util.ArrayList; public class Sushu { public static void main(String[] args){ ArrayList list = new ArrayList(); for(int i = 101; i < 200; i++){ if(isPrime(i)){ list.add(i); } } System.out.println(list + "共有" +list.size()); } public static boolean isPrime(int i){ boolean flag = true; for(int j = 2; j < Math.sqrt(i); j++){ if(i % j == 0){ flag = false; } } return flag; } } 3

package work; public class Flower { public static void main(String[] args){ for(int i = 100; i <999; i++){ if(flower(i)){ System.out.print(i +" "); } } } public static boolean flower(int number){ boolean flag = false; int i = number / 100; // int j = (number - i*100) / 10; int k = number % 10; if((i*i*i + j*j*j + k*k*k) == number){ flag = true; } return flag; } } 4 package work; import java.util.Scanner; import java.io.*; public class Decomposition { private static int k = 2; public static void main(String[] args)throws IOException{ Scanner scanner = new Scanner(System.in); System.out.println("请输入一个整数"); int number = scanner.nextInt(); System.out.print(number + "="); fenJie(number); } public static void fenJie(int number){ if(k == number){ System.out.print(k); return; }

【Java经典算法】有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中

//Java里弹对话框 import javax.swing.JOptionPane; import java.util.Arrays; import java.util.Random; public class ArraySortMine { public static void main(String[] args) { int temp = 0; int myarr[] = new int[12]; Random r = new Random(); for (int i = 1; i <= 10; i++) myarr[i] = r.nextInt(100); System.out.println("The orignal data:"); for (int k = 1; k <= 10; k++) System.out.print(myarr[k] + ","); for (int i = 1; i <= 9; i++) for (int k = i + 1; k <= 10; k++) if (myarr[i] > myarr[k]) { temp = myarr[i]; myarr[i] = myarr[k]; myarr[k] = temp; } System.out.println(); System.out.println("The sort data:"); for (int k = 1; k <= 10; k++) System.out.print(myarr[k] + ","); // here will a Diamonds // 我想让对话框出现提示三次(这时是alert),,之前的提示应该有两个按钮,Yes 和No 用户体验思想,不多说 // https://www.360docs.net/doc/0e19074319.html,/robertlizhiqiang Object[] possibleValues = { "insert data by mysesf ", "Please Fill data for me! " }; Object selectedValue = JOptionPane.showInputDialog(null, "Choose one ", "Input ", https://www.360docs.net/doc/0e19074319.html,RMATION_MESSAGE, null, possibleValues, possibleValues[0]); if (selectedValue == "insert data by mysesf ") { String inputValue = JOptionPane .showInputDialog("Please input your access data(Only 3 times)! "); // first time input data

JAVA经典算法面试10题及答案

JAVA经典算法面试10题及答案 1.程序分析:兔子的规律为数列1,1,2,3,5,8,13,21 . public class exp2{ public static void main(string args[]){ int i=0; for(i=1;i i++) system.out.println(f(i)); } public static int f(int x) { if(x==1 || x==2) return 1; else return f(x-1)+f(x-2); }}或public class exp2{ public static void main(string args[]){ int i=0; math mymath = new math(); for(i=1;i i++) system.out.println(mymath.f(i)); }}class math{ public int f(int x) { if(x==1 || x==2) return 1; else return f(x-1)+f(x-2); }}【程序2】题目:判断101-200之间有多少个素数,并输出所有素数。 1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除, 则表明此数不是素数,反之是素数。 public class exp2{ public static void main(string args[]){ int i=0; math mymath = new math(); for(i=2;i =200;i++) if(mymath.iszhishu(i)==true) system.out.println(i); }}class math{ public int f(int x) { if(x==1 || x==2) return 1; else return f(x-1)+f(x-2); } public boolean iszhishu(int x) { for(int i=2;i =x/2;i++) if (x % 2==0 ) return false; return true; }}【程序3】题目:打印出所有的水仙花数,所谓水仙花数是指一个三位数,其

经典的JAVA算法题及答案

1.使用Java语言编写代码,将一个正整数分解质因数,例如:输入90,打印输出90=2*3*3*5。 答案:public class Math{ public static void main(String[] args) { int n,i; System.out.println("\nplease input a number:\n"); Scanner input=new Scanner(System.in); n=input.nextInt(); System.out.println(n); for(i=2;i<=n;i++) { while(n!=i) { if(n%i==0) { System.out.println(i); n=n/i; } else{ break; } } } System.out.println(n); } } 2.题目如下:用1、2、2、3、4、5这六个数字,用java写一个main函数,打印出所有不同的排列,如:512234、412345等,要求:"4"不能在第三位,"3"与"5"不能相连。 static int[] bits = new int[] { 1, 2, 3, 4, 5 }; /** * @param args */ public static void main(String[] args) { sort("", bits); } private static void sort(String prefix, int[] a) { if (a.length == 1) { System.out.println(prefix + a[0]);

Java数据结构和算法笔记

~ Java数据结构和算法 第0讲综述 参考教材:Java数据结构和算法(第二版),[美] Robert lafore 1. 数据结构的特性 缺点 数据结构! 优点 数组插入快;如果知道下标,可以非常快地存取查找慢,删除慢,大小固定 有序数组比无序的数组查找快删除和插入慢,大小固定提供后进先出方式的存取存取其他项很慢 & 栈 队列提供先进先出方式的存取存取其他项很慢 链表插入快,删除快( 查找慢 二叉树查找、插入、删除都快(如果树保持平衡)删除算法复杂 红-黑树查找、插入、删除都快;树总是平衡的算法复杂 2-3-4树。 算法复杂 查找、插入、删除都快;树总是平衡的;类 似的树对磁盘存储有用 哈希表如果关键字已知,则存储极快;插入快删除慢,如果不知道关键字则存 储很慢,对存储空间使用不充分堆插入、删除快;对大数据项的存取很快对其他数据项存取慢 对现实世界建模有些算法慢且复杂 ' 图 2. 经典算法总结 查找算法:线性查找和二分查找 排序算法: 用表展示 ^ 第一讲数组 1.Java中数组的基础知识

1)创建数组 … 一旦创建数组,数组大小便不可改变。 2)访问数组数据项 数组数据项通过方括号中的下标来访问,其中第一个数据项的下标是0: 3)数组的初始化 当创建数组之后,除非将特定的值赋给数组的数据项,否则它们一直是特殊的null对象。 《 2.面向对象编程方式 1)使用自定义的类封装数组

)…

子问题须与原始问题为同样的事,且更为简单; b. 不能无限制地调用本身,须有个出口,化简为非递归状况处理。 1.三角数字 该数列中的首项为1,第n项是由第n-1项加n后得到的。 1)使用循环查找第n项

java 贪吃蛇算法分析和代码

贪吃蛇是一款非常经典的手机游戏。它有很多算法,这里详细分析一种比较优秀的算法。 首先介绍下主要用到的七个类: ●WormMain:最主要的类,控制所有其它类的运行和销毁。 ●WormPit:处理键盘输入事件并实例化Worm类和WormFood类的。 ●Worm:抽象了贪吃蛇的属性和动作 ●WormFood:抽象了食物的属性和动作 ●WormScore:用来纪录分数的类 ●WormLink:抽象了蛇身上的一段,保存了这段的坐标、方向和所有状态。 ●WormException:处理异常类 基本概念介绍 节:一条蛇可以看成有许多正方形的“小格子”拼凑成,我把它称作节。节是蛇身上最小的单位。 段:当许多节连成一条直线,我称它为段。上图的贪吃蛇只有一段,如果它拐弯就变成两段。 链表:用来保存每一段的状态,链表的元素单位是段。且链表的最后一个元素表示蛇的头部段。 坐标系:MIDP中的坐标以左上角那点为(0,0),向右则x递增,向下则y递增。 Worm类 一条完整的贪吃蛇是由一段一段组成的。链表中保存的第一个元素是蛇的尾巴段,最后一个元素是蛇的头部段。当蛇运动的时候,它头部段增加一节而尾段减少一节。如果它吃到了食物,尾部段就不减少一节。也就是说,蛇是从头部段开始长的。 下面的代码段显示了Worm类保存的各种属性: /* 贪吃蛇可能移动的方向 */ public final static byte DOWN = 2; public final static byte LEFT = 4;

public final static byte RIGHT = 6; public final static byte UP = 8; // 贪吃蛇的当前方向 private byte currentDirection; // 保存贪吃蛇每一段的列表 private Vector worm = new Vector(5, 2); // 是否需要更新状态 private boolean needUpdate; // 是否在运动中 private boolean moveOnNextUpdate; // 是否吃到食物 private boolean hasEaten; // 贪吃蛇的初始位置、长度和方向 private final static int INIT_X = 3; private final static int INIT_Y = 8; private final static int INIT_LEN = 8; private final static byte INIT_DIR = RIGHT; 下面重点介绍下Worm类中的几个方法: public void setDirection(byte direction) 这个方法用来改变贪吃蛇运动的方向,只能90度。看下面的实现代码:if ((direction != currentDirection) && !needUpdate) { // 取出列表中的最后一个元素(蛇的头部) WormLink sl = (WormLink)https://www.360docs.net/doc/0e19074319.html,stElement();

JAVA面试中常见的经典算法题

JAVA面试中常见的经典算法题【回顾总结】(2010-08-09 00:20:20) 1.写一个方法,用一个for循环打印九九乘法表 Java code public void nineNineMulitTable(){ for (int i = 1,j = 1; j <= 9; i++) { System.out.print(i+"*"+j+"="+i*j+" "); if(i==j){ i=0; j++; System.out.println(); } } } 2.给定一个java.util.Date对象,如何转化为”2007-3-22 20:23:22”格式的字符串 Java code public String date2FormatStr(Date date) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String str = sdf.format(date); return str; } 3.写一个方法,能够判断任意一个整数是否素数 Java code public boolean isPrimeNumber(int num) { for (int i = 2; i <= Math.sqrt(num); i++) {

if(num%i==0) { return false; } } return true; } 4.写一个方法,输入任意一个整数,返回它的阶乘 Java code public int factorial(int num) { //递归if(num == 1) { return 1; } return num*factorial(num-1); } 5.写一个方法,用二分查找法判断任意整数在任意整数数组里面是否存在,若存在就返回它在数组中的索引位置,不存在返回-1 Java code public int binarySearch(int[] dataset,int data,int beginIndex,int endIndex){ int midIndex = (beginIndex+endIndex)/2; //如果查找的数要比开始索引的数据要小或者是比结束索引的书要大,或者开始查找的索引值大于结束的索引值返回-1没有查到if(data

个最常见的Java算法

代码面试最常用的10大算法 发表于2018-04-10 11:34| 16225 次阅读| 来源ProgramCreek| 279 条评论| 作者X Wang Java面试算法排序二叉树归并排序职业生涯 摘要:面试也是一门学问,在面试之前做好充分的准备则是成功的必须条件,而程序员在代码面试时,常会遇到编写算法的相关问题,比如排序、二叉树遍历等等。 在程序员的职业生涯中,算法亦算是一门基础课程,尤其是在面试的时候,很多公司都会让程序员编写一些算法实例,例如快速排序、二叉树查找等等。 本文总结了程序员在代码面试中最常遇到的10大算法类型,想要真正了解这些算法的原 理,还需程序员们花些功夫。 1.Stri ng/Array/Matrix 在Java中,String是一个包含char数组和其它字段、方法的类。如果没有IDE自动完成 代码,下面这个方法大家应该记住: toCharArray(> //get char array of a Stri ng Arrays.sort(> //sort an array Arrays.toStri ng(char[] a> //con vert to stri ng charAt(i nt x> //get a char at the specific in dex len gth(> //stri ng len gth len gth //array size substri ng(i nt beg inIn dex> substri ng(i nt beg inIn dex, int endln dex> In teger.valueOf(>//stri ng to in teger Stri ng.valueOf(>/i nteger to stri ng String/arrays很容易理解,但与它们有关的问题常常需要高级的算法去解决,例如动态编程、递归等。 下面列出一些需要高级算法才能解决的经典问题: Evaluate Reverse Polish Notati on Lon gest Pali ndromic Substri ng 单词分割 字梯 Media n of Two Sorted Arrays

相关主题
相关文档
最新文档