分享几个算法题,经典可能有点算不上,只能算是初学算法的一点小题目吧
声明:每道题思路可能不止一种,可能有很多种,具体详情请自己百度,Thank you!
1.交换两个数(尽量用多种方法)
分析
- swap1,最常用的用一个temp变量来交换
- swap2,两个数相加的和然后减去b的值,那么剩下的值就为a,此时将值赋值给b,这样就把值交换了
- swap3,一个数异或同一个数两次后还是那个数
/**
* @author Harry
* 1.交换两个数(尽量用多种方法)
*/
public class day01 {
public static void swap1(int a,int b) {
int temp = a;
a = b;
b = temp;
System.out.println(a+","+b);
}
public static void swap2(int a,int b) {
a = a + b;
b = a - b;
a = a - b;
System.out.println(a + "," + b);
}
public static void swap3(int a,int b) {
a = a^b;
b = a^b;
a = a^b;
System.out.println(a + "," + b);
}
public static void main(String[] args) {
swap1(1, 2);
swap2(1, 2);
swap3(1, 2);
}
}
2.杨辉三角
分析:思路也有很多种,相应的实现代码也有很多,具体的自己百度吧,这里仅展现一种!观察后会发现每一行的第一个和最后一个的数值都为1,而剩下的数为上一行本列的数和上一行本列的前一个数的和。
/**
* @author Harry
* 2.杨辉三角
*/
public class day02 {
public static void main(String[] args) {
int MMax = 10; //打印行数
int arr[][] = new int[MMax+1][MMax+1]; //定义一个数组来装所有数
for (int i = 0; i < arr.length; i++) {
for(int j=0;j<=i;j++) {
if(j==0 || j==i ) {
//将第一个和最后一个都赋值为1
arr[i][j] = 1;
}else {
//将上一行的本列数与上一行的本列前一个数相加得到此处的数字
arr[i][j] = arr[i-1][j] + arr[i-1][j-1];
}
}
}
for (int i = 0; i < arr.length; i++) {
for(int j=0;j<=i;j++) {
System.out.print(arr[i][j] + "\t");
}
System.out.println();
}
}
}
3.斐波那契数列
分析:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610...很明显的可以看出来从第三个数开始,每个数的值为前两个数的和,直接递归解决,至于不太懂递归的同学,多去看看递归的原理,我就不多说了。
/**
*
* @author Harry
* 3.著名的菲波拉契(Fibonacci)数列
*/
public class day03 {
public static int f(int n) {
if(n==0) return 0;
if(n==1||n==2)
return 1;
else
return f(n-1) + f(n-2);
}
public static void main(String[] args) {
int x = 20;
for(int i=0; i<20; i++)
System.out.println(f(i));
}
}
4.判断回文字符串
分析:例如ABCDBCA 和 ABCDDBCA 都属于回文字符串,思路很简单,从两端开始对比是否相同,只要有一个不同返回false,相同返回true
/**
* @author Harry
* 4.回文字符串
*/
public class day04 {
public static void f(char[] ch) {
for(int i=0;i<ch.length;i++) {
if(ch[i] != ch[ch.length-i-1]) {
System.out.println("不是回文字符串");
return;
}
}
System.out.println("是回文字符串");
}
public static void main(String[] args) {
String str = "ABCDCBAA";
char[] ch = str.toCharArray();
f(ch);
}
}
5.使用Java 计算 9223372036854775807 + 1的值
分析:个人使用了最简单的方法来算这种数,直接用大整数类型BigInteger
import java.math.BigInteger;
/**
* @author Harry
* 5.使用Java 计算 9223372036854775807 + 1的值
*/
public class day05 {
public static void main(String[] args) {
BigInteger b = new BigInteger("9223372036854775807");
System.out.println(b.add(new BigInteger("1")));
}
}
6.角谷定理
角谷定理:一个自然数,若为偶数,则把它除以2,若为奇数,则把它乘以3加1.经过如此有限运算后,总可以得到自然数值1.求经过多少次可以得到自然数1.
/**
* @author Harry
* 角谷定理,输入一个自然数,若为偶数,则把它除以2,若为奇数,则把它乘以* 3加1.
*/
public class day06_02 {
public static void main(String[] args) {
int a = 3;
int count = 0;
while(a != 1) {
if(a % 2 == 0)
a /= 2;
else
a = a * 3 + 1;
count++;
}
System.out.println(count + "次");
}
}
7.将十进制转换为二进制
分析:将十进制转换为二进制,两种方法。(提示:1.使用jdk自带方法 2.使用逢二进一方法)
/**
* @author Harry
* 3.将十进制转换为二进制,两种方法。
* (提示:1.使用jdk自带方法 2.使用逢二进一方法)
*/
public class day7 {
public static void convert1(int a) {
String str = Integer.toBinaryString(a);
System.out.println(str);
}
public static void convert2(int a) {
int n;
String str = "";
while(a != 0) {
n = a%2;
a /= 2;
str = n + str;
str.concat(str);
}
System.out.println(str);
}
public static void main(String[] args) {
int a = 100;
convert1(a);
convert2(a);
}
}
如有错误的地方还请提醒我,让我改正,以免误人子弟,如果你们还有更好的题目,也请在评论区留言,以后会考虑加在文章内的!