文章目录

  • 使用函数求最大值
  • 求 N 的阶乘
  • 求阶乘和
  • 求斐波那契数列的第n项。(迭代实现)
  • 求和的重载
  • 求最大值方法的重载
  • 递归求和
  • 递归打印数字的每一位
  • 返回的数字之和
  • 递归求解汉诺塔问题
  • 创建的数组,并且赋初始值
  • 打印数组
  • 改变原有数组元素的值
  • 求数组的平均值
  • 奇数位于偶数之前
  • 二分查找
  • 两数之和
  • 只出现一次的数字
  • 多数元素
  • 存在连续三个奇数的数组

使用函数求最大值

创建方法求两个数的最大值max2,随后再写一个求3个数的最大值的函数max3。
要求:在max3这个函数中,调用max2函数,来实现3个数的最大值计算
本题比较简单,重点在如何求出两个数的最大值

 public static int max2(int a,int b) {return a > b ? a:b;
}public static int max3(int a,int b,int c) {int max = max2(a,b);return max > c ? max : c;
}
public static void main(String[] args) {System.out.println(max3(2, 5, 1));
}

求 N 的阶乘

假设给定数字3,3的阶乘等于1* 2*3。

则有如下代码:

public static int fac( int n) {int tmp = 1;for (int j = 1; j <= n; j++) {tmp *= j;}return tmp;}

方法二:递归

递归代码重要的是推导递推公式:假设N的阶乘用F(n)表示,那么F(n) = n * F(n-1);
递归的优点:代码量少

public static int fac(int n) {if(n == 1) {return 1;}return n * fac(n-1);}

求阶乘和

求1!+2!+3!+4!+…+n!的和


// 求阶乘和public static int facSum(int n) {int sum = 0;for (int i = 1; i <= n; i++) {//fac为 求指定数字的阶乘的函数sum += fac(i);}return sum;}//求 i 的阶乘public static int fac( int i) {int tmp = 1;for (int j = 1; j <= i; j++) {tmp *= j;}return tmp;}public static void main(String[] args) {int ret = facSum(5);System.out.println(ret);}

求斐波那契数列的第n项。(迭代实现)

斐波那契数列定义为:1 1 2 3 5 8 13 21 我们可以看到,从第3项开始,都等于前一项+前一项的前一项的和。
3=1+2
5+2+3
13 = 5+8
我们可以先定义f1保存第一项的值,f2保存第2项的值,f3保存第3项的值。
每次算法一个f3,就同步更新f1和f2的值。

public static int fib(int n) {if(n == 1 || n == 2 ) {return 1;}int f1 = 1;int f2 = 1;int f3 = 1;for (int i = 3; i <= n; i++) {f3 = f1+f2;f1 = f2;f2 = f3;}return f3;}

方法二:递归

假设用F(n) 代表第n项斐波那契数列的值,那么F(n) = F(n-1) + F(n-2)的和

public static int fib(int n) {if(n == 1 || n == 2) {return 1;}return fib(n-1)+fib(n-2);}

求和的重载

在同一个类中,分别定义求两个整数的方法 和 三个小数之和的方法。 并执行代码,求出结果

重载满足的几个条件:
1、方法名相同
2、参数列表不同(数据类型,个数,顺序)
3、返回值无关

public static int sum(int a,int b) {return a+b;
}public static double sum(double a,double b,double c) {return a+b+c;
}

求最大值方法的重载

在同一个类中定义多个方法:要求不仅可以求2个整数的最大值,还可以求3个小数的最大值?

本题可以借助Java原生类Math当中的max方法求最大值,当然也可以自己通过If else进行比较。
Math的使用 不需要导入相关的包

public static int max(int a,int b) {return Math.max(a,b);
}public static double max(double a,double b,double c) {double m = Math.max(a,b);return Math.max(m,c);
}

递归求和

递归求 1 + 2 + 3 + … + 10

假设用F(n) 代表1-n的和,那么F(n) = n + F(n-1)的和
F(n-1)就是1到n-1的和

public static int add(int n) {if(n == 1) {return 1;}return n+add(n-1);}

递归打印数字的每一位

按顺序打印一个数字的每一位(例如 1234 打印出 1 2 3 4) (递归)

假设用F(n) 代表 要顺序打印n的每一位,如果n是一个1位数,直接输出,如果n是2位数以上。
如:
123 相当于先打印12的每一位,再打印3
12 相当于先打印1的每一位,再打印2
1 只有一位数,直接打印。
依次回退打印完,每一位即可。

     public static void print(int n) {if(n <= 9) {System.out.print(n%10+" ");return;}print(n/10);System.out.print(n%10+" ");}

返回的数字之和

写一个递归方法,输入一个非负整数,返回组成它的数字之和

要计算123的每一位,主要在于如何得到每一位。在前面的习题中我们知道,除10 , 模10.可以做到。
如下图,在执行n=123的时候,先执行add(123/10)也就是add(12)这个函数,等最后回来之后,才会把n=123时候的n%10算完。

public static int add(int n) {if(n > 10) {return add(n/10)+n%10;}return n%10;
}

递归求解汉诺塔问题

汉诺塔是一个比较复杂的问题,这个是专门的讲解视频,大家点击观看:汉诺塔

public static void move(char pos1,char pos2) {System.out.print(pos1+"->"+pos2+" ");
}public static void hanoi(int n,char pos1,char pos2,char pos3) {if(n == 1) {move(pos1,pos3);return;}hanoi(n-1,pos1,pos3,pos2);move(pos1,pos3);hanoi(n-1,pos2,pos1,pos3);
}

创建的数组,并且赋初始值

创建一个 int 类型的数组, 元素个数为 100, 并把每个元素依次设置为 1 - 100

public static void main(String[] args) {int[] array = new int[100];for (int i = 0; i < array.length; i++) {//题目要求赋值1-100,这里利用下标的值,然后+1即可。array[i] = i+1;}
}

打印数组

实现一个方法 printArray, 以数组为参数, 循环访问数组中的每个元素, 打印每个元素的值.

public static void printArray(int[] arrayTmp) {for (int i = 0; i < arrayTmp.length; i++) {System.out.print(arrayTmp[i]+" ");}System.out.println();
}public static void main(String[] args) {int[] array = new int[100];for (int i = 0; i < array.length; i++) {array[i] = i+1;}printArray(array);
}

改变原有数组元素的值

实现一个方法 transform, 以数组为参数, 循环将数组中的每个元素 乘以 2 , 并设置到对应的数组元素上. 例如 原数组为 {1, 2, 3}, 修改之后为 {2, 4, 6}

将数组里面的值 扩大2倍,有两种方式,一种是在自己本身上进行扩大,一种是新的数组中扩大。如下代码:

//方式一:扩大的还是原来的数组,这样做的不好的地方是,改变了原来数组的值
public static void func2(int[] array) {for (int i = 0; i < array.length; i++) {array[i] = array[i]*2;}}//方式二:扩大的新的数组,没有修改原来的值
public static int[] func3(int[] array) {int[] tmp = new int[array.length];//for (int i = 0; i < array.length; i++) {tmp[i] = array[i]*2;}return tmp;
}

求数组的平均值

实现一个方法 avg, 以数组为参数, 求数组中所有元素的平均值(注意方法的返回值类型).

本题比较简单,将数组中的值依次相加,最后除以总长度即可,但需要注意,平均值可能是小数

public static double avg(int[] array) {int sum = 0;for (int i = 0; i < array.length; i++) {sum = sum+array[i];}double ret = sum*1.0 / array.length;return ret;
}

奇数位于偶数之前

调整数组顺序使得奇数位于偶数之前。调整之后,不关心大小顺序。
如数组:[1,2,3,4,5,6]
调整后可能是:[1, 5, 3, 4, 2, 6]

本题可以使用2个下标,一个从0下标开始,一个从最后一个下标开始。

public static void func4(int[] array) {int i = 0;int j = array.length-1;while (i < j) {//循环外面给了i < j  ,思考这里为什么还需要判断?while (i < j && array[i] % 2 != 0) {i++;}//i 下标一定是偶数while (i < j && array[j] % 2 == 0) {j--;}int tmp = array[i];array[i] = array[j];array[j] = tmp;}
}

二分查找

给定一个有序整型数组, 实现二分查找

注意看题,题目中数组是有序的!

二分查找,效率很高,每次都能排除一半的元素。

public static int binarySearch(int[] array,int key) {int left = 0;int right = array.length-1;while (left <= right) {int mid = (left+right)/2;if(array[mid] == key) {return mid;}else if(array[mid] < key) {left = mid+1;}else {right = mid-1;}}return -1;//代表没有找到这个数字
}

两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。

示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

本题最重要的一句话:假设每种输入只会对应一个答案
也就意味着不会有多个答案,暴力求解就是挨个匹配查找即可,代码如下:

public int[] twoSum(int[] nums, int target) {int[] result = new int[2];// 双指针i和j,i从前向后遍历,j从后向i遍历,若arr[i]+arr[j]=target,即为题解for (int i = 0; i < nums.length - 1; i++) {for (int j = nums.length - 1; j > i; j--) {if (nums[i] + nums[j] == target) {result[0] = i;result[1] = j;}}}return result;
}

只出现一次的数字

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

本题主要考察运算符:异或。
异或的特点是:
1、n ^ n = 0;即两个相同的数字异或是0
2、0 ^ n = n;即0和任何数字进行异或,结果就是那个任何数字。

public int singleNumber(int[] nums) {// 用异或运算的性质可以巧妙的解决这个问题,因为数组中只有一个数字出现一次// 则其他出现两次的数字用异或运算后都是0,最终整个数组异或运算的结果即为所求。int ret = 0;for (int i : nums) {ret ^= i;}return ret;
}

多数元素

给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。

数组中出现次数超过一半的数字,一定是排好序之后,中间位置的数字。

//最简单的方法排序
public int majorityElement(int[] nums) {Arrays.sort(nums);return nums[nums.length/2];
}

方法二:从第一个数开始count=1,遇到相同的就加1,遇到不同的就减1,减到0就重新换个数开始计数,总能找到最多的那个

    public static void main(String[] args) {int arr[] = {1,1,2,2,1,3,3,3,3,5,5,3,3,3,3,6,5,3,3,};for (int i = 0; i < arr.length; i++) {int a = 1;for (int j = i+1; j < arr.length; j++) {if(arr[i] == arr[j]){a++;}else {a--;}if(a==0){break;}}if(a != 0){System.out.println(arr[i]);break;}}}

存在连续三个奇数的数组

给你一个整数数组 arr,请你判断数组中是否存在连续三个元素都是奇数的情况:如果存在,请返回 true ;否则,返回 false 。

示例 1:
输入:arr = [2,6,4,1]
输出:false
解释:不存在连续三个元素都是奇数的情况。

示例 2:
输入:arr = [1,2,34,3,4,5,7,23,12]
输出:true
解释:存在连续三个元素都是奇数的情况,即 [5,7,23] 。

本题比较简单,数字是连续出现的,所以我们只需要定义一个计数器,如果连续出现的次数超过3,则返回true。

public boolean threeConsecutiveOdds(int[] arr) {// 引入标志位记录连续出现奇数的个数int count = 0;for (int i = 0; i < arr.length; i++) {if (isConsecutiveOdd(arr[i])) {// 出现奇数,count ++;count ++;if (count == 3) {// 出现连着三个奇数,返回truereturn true;}}else {// 碰到偶数,count重置count = 0;}}return false;
}private boolean isConsecutiveOdd(int num) {return num % 2 != 0;
}

初识Java-20道经典java基础题分享-一定有你不知道的方法相关推荐

  1. java接口面试题_7道经典Java接口面试题

    Java接口,Java语言中存在的结构,有特定的语法和结构,是Java面试中经常出现的考点,本文为大家准备了7道经典Java接口面试题. 1.什么是接口 接口就是内部模块对模块,外部系统对其他服务提供 ...

  2. 20道经典Redis面试题

    前言 整理了20道经典Redis面试题,希望对大家有帮助. 1. 什么是Redis?它主要用来什么的? Redis,英文全称是Remote Dictionary Server(远程字典服务),是一个开 ...

  3. 20道经典的AJAX面试题(必知必会)

    1.什么是AJAX,为什么要使用Ajax(请谈一下你对Ajax的认识) 什么是ajax: AJAX是"Asynchronous JavaScript and XML"的缩写.他是指 ...

  4. c语言关于continue的题,10道c语言基础题1、C语言的跳转语句中,对于break和continue说法正确的是_______. A、contin...

    10道c语言基础题1.C语言的跳转语句中,对于break和continue说法正确的是_______. A.contin 10道c语言基础题 1.C语言的跳转语句中,对于break和continue说 ...

  5. linux c语言常见面试题及答案,Linux下C语言的几道经典面试题小结(分享)

    Linux下C语言的几道经典面试题小结(分享) 本篇文章整理了几道Linux下C语言的经典面试题,相信对大家更好的理解Linux下的C语言会有很大的帮助,欢迎大家探讨指正. 1.如果在Linux下使用 ...

  6. 我整理了50道经典Java算法题,直接进了字节跳动!!

    写在前面 最近,很多小伙伴都想进入字节跳动这个快速发展的公司,而字节跳动对于算法的要求比较高.于是乎,有些小伙伴问我能否整理一些基础的算法题,帮助他们提升下基础算法能力.我:没问题啊!于是,经过半个多 ...

  7. java 算法_JAVA经典算法40题

    [程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析: 兔子的规律为数列1,1 ...

  8. 20道经典C语言编程题(初级)

    编者按:以下20道题目为自己练习所写的代码,均已提交检测通过,其中有些题也许有更优的解法,所以写的不好望读者包涵,由于个人练习,所以没有写注释,有什么问题的地方,可以留言一起交流学习. ------- ...

  9. java object... arguments_Java面试之基础题---对象Object

    参数传递:Java支持两种数据类型:基本数据类型和引用数据类型. 原始数据类型是一个简单的数据结构,它只有一个与之相关的值.引用数据类型是一个复杂的数据结构,它表示一个对象.原始数据类型的变量将该值直 ...

最新文章

  1. [翻译]一步步教你配置SQL SERVER合并复制(四)提高Distributor的安全性
  2. 小公司如何提高效率?
  3. 腾讯云上午突发故障 称运营商光缆中断所致
  4. 如何将文件地址转为url_Node.js 源码解析 util.promisify 如何将 Callback 转为 Promise
  5. ubuntu14.04安装 R16 Tina Linux SDK
  6. SpringMVC异常处理器代码示例
  7. mvc图片上传到服务器
  8. vscode无法更改文件夹名称
  9. 简单的下载者木马分析
  10. TapTap 发布开发者服务:降低开发者研运成本 聚焦创作优质内容
  11. [时间复杂度]为什么采用二叉排序树查找的平均查找长度为O(log2n)
  12. 如何把html文件格式转为视频格式,如何将qlv格式转换成mp4-太平洋软件资讯-太平洋电脑网...
  13. 妹子尚且如此! 少年努力吧
  14. 我在赶集网的两个月(完整版)
  15. 一篇硕士论文的开题报告,可以借鉴
  16. 圆满收官,百花齐放!2022企业级低代码应用大赛获奖结果公布
  17. 前端ThinkJS框架解析
  18. 在服务器中如何获取项目名,成都汇智动力-java获得项目路径
  19. xtrabackup 备份与还原 mysql数据库
  20. android 类似微信的摇晃触发事件(确认可行,已封装,可直接调用)

热门文章

  1. P2532 [AHOI2012]树屋阶梯($Catalan$数高精度)
  2. android程序怎么导出到手机号码,手机电话号码怎么备份到微信(三种方法教你备份技巧)...
  3. Android onMeasure()测量流程解析
  4. 动态规划与贪心算法比较
  5. linux top命令详解
  6. SGL系列 LED调光电路设计 ANBOZ
  7. vue高仿立体卡片效果(第一版)
  8. java计算机毕业设计某服装店网站源代码+数据库+系统+lw文档
  9. Oracle sql语句执行顺序
  10. java 对象重写equals方法_Java如何重写object类的equals方法详解