最近在回顾之前使用C写过的数据结构和算法的东西,发现本身的算法和数据结构是真的薄弱,如今用Java改写一下,重温一下。java
只能说慢慢积累吧~下面的题目难度都是简单的,算法的大佬可直接忽略这篇文章了~入门或者算法薄弱的同窗可参考一下~程序员
不少与排序相关的小算法(合并数组、获取数字每位值的和),我都没有写下来了,由于只要会了归并排序(合并数组),会了桶排序(获取数字每位的值),这些都不成问题了。若是还不太熟悉八大基础排序的同窗可看:【八大基础排序总结】算法
因为篇幅问题,每篇写十道吧~数组
若是有错的地方,或者有更好的实现,更恰当的理解方式但愿你们不吝在评论区留言哦~你们多多交流微信
1-n
阶乘之和1-n阶乘之和怎么算?数据结构
1
1*2
1*2*3
1*2*3*4
如今咱们要求这些阶乘的和。思路:数据结构和算法
/** * 1-n的阶乘之和 */
public static void Factorial(int n) {
//总和
double sum = 0;
//阶乘值,初始化为1
double factorial = 1;
for (int i = 1; i <= n; i++) {
factorial = factorial * i;
sum = (int) (sum + factorial);
}
System.out.println("公众号:Java3y" + " " + sum);
}
复制代码
获取二维数组每列最小的值spa
思路:遍历列,再遍历列中行3d
咱们通常操做数组都是从行开始,再到列的。此次要求的是每列的最小值,所以须要在内部for循环遍历的是行code
/** * 求出二维数组每列的最小值 */
public static void minArray() {
//二维数组
int[][] arrays = {
{23, 106, 8, 234},
{25, 9, 73, 19},
{56, 25, 67, 137}
};
//获取列数
int maxColLength = arrays[0].length;
//使用一个数组来装载每列最小的值
int[] minArray = new int[maxColLength];
//控制列数
for (int i = 0; i < maxColLength; i++) {
//假设每列的第一个元素是最小的
int min = arrays[0][i];
//控制行数
for (int j = 1; j < arrays.length; j++) {
//找到最小值
if (arrays[j][i] < min) {
min = arrays[j][i];
}
}
//赋值给装载每列最小的值的数组
minArray[i] = min;
}
System.out.println("公众号:Java3y" + " " + minArray);
}
复制代码
求"1!+4!(2的平方)+9!(3的平方)的值
思路:先求平方,后求阶乘,最后相加便可~
/** * 求"1!+4!(2的平方)+9!(3的平方)+...+n的值 */
public static void calculate() {
double sum = 0;
for (int i = 1; i <= 3; i++) {
//获得平方数
int square = i * i;
//阶乘值,从1开始
double factorial = 1;
//求阶乘
for (int j = 1; j <= square; j++) {
factorial = factorial * j;
}
sum = sum + factorial;
}
System.out.println("公众号:Java3y" + " " + sum);
}
复制代码
数组对角线元素之和
思路:
/** * 数组对角线之和 */
public static void arraySum() {
int[][] arrays = {
{23, 106, 8, 234},
{25, 9, 73, 19},
{56, 25, 67, 137},
{33, 22, 11, 44},
};
//和
int sum = 0;
for (int i = 0; i < arrays.length; i++) {
for (int j = 0; j < arrays[i].length; j++) {
if (i == j) {
sum = sum + arrays[i][j];
}
}
}
System.out.println("公众号:Java3y" + sum);
}
复制代码
杨辉三角形
杨辉三角形长的是这个样子:
ps:图片来源网上,侵删~
规律:
代码实现:
/** * 打印杨辉三角形 */
public static void PascalTriangle() {
//打印十行的杨辉三角形
int[][] arrays = new int[10][];
//行数
for (int i = 0; i < arrays.length; i++) {
//初始化第二层的大小
arrays[i] = new int[i + 1];
//列数
for (int j = 0; j <= i; j++) {
//是第一列,第一行,行数等于列数,那么统统为1
if (i == 0 || j == 0 || j == i) {
arrays[i][j] = 1;
} else {
//当前值等于头上的值+头上左边的值
arrays[i][j] = arrays[i - 1][j] + arrays[i - 1][j - 1];
}
}
}
System.out.println("公众号:Java3y" + "-------------------------------");
for (int[] array : arrays) {
for (int value : array) {
System.out.print(value + "\t");
}
System.out.println();
}
System.out.println("公众号:Java3y" + "-------------------------------");
}
复制代码
结果:
猴子摘下了n个桃子,当天吃掉一半多一个,次日也是吃掉剩下桃子的一半多一个,到了第十天,桃子只剩下了1个。问:猴子第一天摘了多少个桃子
思路:
f(n - 1) = f(n)/2 - 1
,f(n) = 2 * f(n - 1) + 2
用递归和循环均可解决:
递归方式:
/** * 猴子吃桃问题 * @param x 天数 */
public static int monkeyQue(int x) {
if (x <= 0) {
return 0;
} else if (x == 1) {
return 1;
} else {
return 2 * monkeyQue(x - 1) + 2;
}
}
复制代码
循环方式:
int x = 1;
for (int i = 1; i <= 9; i++) {
x = (x + 1) * 2;
}
复制代码
结果:
输入一段字符,计算出里面单词的个数,单词之间用空格隔开 ,一个空格隔开,就表明着一个单词了
思路:
/** * 输入一段字符,计算出里面单词的个数 * * @param str 一段文字 */
public static int countWord(String str) {
// 0 表示空格状态,1 表示非空格状态
int flag = 0;
// 单词次数
int num = 0;
for (int i = 0; i < str.length(); i++) {
if (String.valueOf(str.charAt(i)).equals(" ") ) {
flag = 0;
} else if (flag == 0) {
num++;
flag = 1;
}
}
return num ;
}
复制代码
结果:
给定两个字符串s和t,判断这两个字符串中的字母是否是彻底同样(顺序能够不同)
思路:
'a'
,将其分别存入到数组中去,随后看这两个数组是否相等便可要点:
'c'-'a'=2
便可计算出存储的位置,若是有多个,则+1便可,后面咱们来比较数组大小代码实现:
/** * 给定两个字符串s和t,判断这两个字符串中的字母是否是彻底同样(顺序能够不同) */
public static void isAnagram() {
//分别存储字符串的字符
char[] array1 = new char[26];
char[] array2 = new char[26];
String s1 = "pleasefollowthewechatpublicnumber";
String s2 = "pleowcnumberthewechatpubliasefoll";
for (int i = 0; i < s1.length(); i++) {
char value = s1.charAt(i);
// 算出要存储的位置
int index = value - 'a';
array1[index]++;
}
for (int i = 0; i < s2.length(); i++) {
char value = s2.charAt(i);
// 算出要存储的位置
int index = value - 'a';
array2[index]++;
}
for (int i = 0; i < 26; i++) {
if (array1[i] != array2[i]) {
System.out.println("不相同");
return;
}
}
System.out.println("相同");
}
复制代码
结果:
判断一个数是否是2的某次方
思路:
/** * 判断是不是2的某次方 */
public static void isPowerOfTwo() {
int num = 3;
if (num == 0) {
System.out.println("不是");
}
while (num % 2 == 0) {
num = num / 2;
}
if (num == 1) {
System.out.println("是");
} else {
System.out.println("不是");
}
}
复制代码
结果:
这题还有另外一种解决方式,就是位运算:
if(num <= 0){
System.out.println("不是");
}
else if(num == 1){
System.out.println("是");
}
else{
if( (num & (num-1) ) == 0){
System.out.println("是");
}
else{
System.out.println("不是");
}
}
复制代码
判断一个数字是否是ugly number(分解出来的质因数只有二、三、5这3个数字)
思路:
代码:
/** * 判断一个数字是否是ugly number(分解出来的质因数只有二、三、5这3个数字) * @param num */
public static void isUgly(int num) {
if (num <= 0) {
System.out.println("不是");
} else {
while (num % 2 == 0) {
num = num / 2;
}
while (num % 3 == 0) {
num = num / 3;
}
while (num % 5 == 0) {
num = num / 5;
}
if (num == 1) {
System.out.println("是");
} else {
System.out.println("是");
}
}
}
复制代码
结果:
没错,你没看错,简单的小算法也要总结!
其实我以为这些比较简单的算法是有"套路"可言的,你若是知道它的套路,你就很容易想得出来,若是你不知道它的套路,那么极可能就不会作了(没思路)。
积累了必定的"套路"之后,咱们就能够根据经验来推断,揣摩算法题怎么作了。
举个很简单的例子:
9*9
乘法表谁没背过?好比看到2+2+2+2+2
,会了乘法(套路)之后,谁还会慢慢加上去。看见了5个2,就直接得出2*5
了1-n
阶乘之和
1*2*3*4*...n
,实际上就是一个循环的过程,求和就套个sum变量便可!'c-a'
就是字母c
在数组的位置了(也就是2)。因为字母出现的次数不惟一,所以咱们比较的是数组的值(若是出现了两次,那么值为2,若是出现了3次,那么值为3)。只要用于装载两个数组的值都吻合,那么字母就是同样!&
运算,那么确定为0。用这个特性就很是好判断该数是不是2的某次方了number % 2 == 0
就能够缩小,每次number / 2
),最后的商必然是1。number%2||%3||%5==0
,每次number / 2 | / 3 /5
),最后的商必然是1。若是文章有错的地方欢迎指正,你们互相交流。习惯在微信看技术文章,想要获取更多的Java资源的同窗,能够关注微信公众号:Java3y