作业代码:
package com.qfedu.day03;
import java.util.Scanner;
/**
* @Author laoyan
* @Description TODO
* @Date 2022/3/3 9:26
* @Version 1.0
*
* 这几天的编程难点:
* 1、如何使用变量
* 2、方法如何定义 有没有参数,有几个参数,什么类型,需不需要返回值,以及返回值类型写什么比较合适
*
*
* java基础:
* 变量
* if-else
* for while
* 会定义方法
* 各种常用类的方法 String Math Random Scanner
* 集合(List,Set,Map)
*/
public class HomeWork01 {
/**
* 第二道题目:
* 编程题:
* 编写一个应用程序,当用户输入一串字符后,将大写转换为小写,
* 将小写转换为大写,并统计出该字符串中大写字母多少个,小写字母多少个?
* 比如用户依次输入: A b d D E d f c G .....
* 依次循环获取用户输入的值,然后大写变小写,并打印用户输入了多少个大写字母,多少个小写字母。
*
* String 中的两个重要的方法:
* charAt(下标) 从字符串中的特定位置获取一个char
* toCharArray() 将一个字符串变为一个字符数组。
*/
public static void second(){
Scanner scanner = new Scanner(System.in);
System.out.println("请输入多个字母,以空格隔开,以.结束:");
// ZhangSan
int bigCount = 0,smallCount = 0;
String ziMu = "-1" ;
while(!ziMu.equals(".")) { // api
ziMu = scanner.next(); // "A"
System.out.println(ziMu);
char c = ziMu.charAt(0);// 'A'
if (c >= 'A' && c <= 'Z') {
c += 32;
bigCount++;
} else if (c >= 'a' && c <= 'z') {
c -= 32;
smallCount++;
}
System.out.print(c + "\t");
}
System.out.println("本地大写的字母有:"+bigCount+"个,小写有"+smallCount+"个");
}
public static void second2(){
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个字符串:");
// ZhangSan
int bigCount = 0,smallCount = 0;
String str = scanner.nextLine(); // "A"
char[] chars = str.toCharArray(); // A b C D
// ['A',' ','b'.....]
for (int i = 0; i < chars.length; i++) {
char c = chars[i]; // 'A'
if (c >= 'A' && c <= 'Z') {
c += 32;
bigCount++;
} else if (c >= 'a' && c <= 'z') {
c -= 32;
smallCount++;
}
System.out.print(c + "\t");
}
System.out.println("本地大写的字母有:"+bigCount+"个,小写有"+smallCount+"个");
}
public static void main(String[] args) {
//second();
second2();
}
}
package com.qfedu.day03;
/**
* @Author laoyan
* @Description TODO
* @Date 2022/3/3 10:03
* @Version 1.0
*
* 打印如下:
* ABCDE
* BCDEF
* CDEFG
* DEFGH
* EFGHI
*/
public class HomeWork02 {
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
// 负责打印空格
for (int j = 0; j < i; j++) {
System.out.print(" ");
}
for (int j = 0; j < 5; j++) {
System.out.print((char) (j+i+65));
}
System.out.println();
}
}
}
一、数组
1、概念
数组就是一个容器,可以存储一串相同类型的数据。
2、定义
package com.qfedu.day03_02;
import java.util.Arrays;
/**
* @Author laoyan
* @Description TODO
* @Date 2022/3/3 10:18
* @Version 1.0
*/
public class Demo01 {
public static void main(String[] args) {
// int[] 这样的数组的数据类型是引用数据类型,跟String,Student都是一样的
// 数据类型除了8大基本数据类外都是引用。
int[] arr = null; // int类型的数组只能存放int类型的数据
double[] arr2 = null;
System.out.println(arr2);
int[] arr3 = new int[5];
String[] arr4 =new String[5];
System.out.println(arr3);
System.out.println(arr3.toString());
System.out.println(Arrays.toString(arr3));
System.out.println(Arrays.toString(arr4));// ctrl + d
int[] arr5 = {1,2,3,59};
// 是上面写法的复杂写法,不建议
int[] arr6 = new int[]{1,2,3,59};
System.out.println(Arrays.toString(arr5));
}
}
3、数组在jvm内存模型中的示意图
4、遍历数组
package com.qfedu.day03_02;
/**
* @Author laoyan
* @Description TODO
* @Date 2022/3/3 11:10
* @Version 1.0
*/
public class Demo02 {
public static void main(String[] args) {
int[] arr = {1,3,5,9,10};
System.out.println(arr[4]);// [下标] 下标从0开始的
System.out.println(arr.length);// 可以获取数组的长度
//System.out.println(arr[5]);
/*
最普通的循环方式
*/
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
/**
* 针对数组或者集合,for循环出了一个增强版
* 可以非常方便的遍历数组,但是如果你还需要使用到了数组中的下标,该方式不适应。
*/
for (int suibian : arr) { // 从arr数组中依次拿出一个值,赋值给suibian这个变量
System.out.println(suibian);
}
}
}
小心数组下标越界
5、查找数组
普通查找:
package com.qfedu.day03_03;
/**
* @Author laoyan
* @Description TODO
* @Date 2022/3/3 14:25
* @Version 1.0
*/
public class Demo01 {
// 查询 10 是否在数组 arr 中,如果有返回其 下标,如果没有 -1
public static int searchElement(int[] arr, int num){
for (int i = 0; i < arr.length; i++) {
if(arr[i] == num){
return i;
}
}
return -1;
}
public static void main(String[] args) {
int[] arr = {10,8,5,12,19};
System.out.println(searchElement(arr, 5));
}
}
二分查找:
package com.qfedu.day03_03;
/**
* @Author laoyan
* @Description TODO
* @Date 2022/3/3 14:34
* @Version 1.0
*/
public class Demo02 {
/**
* 二分查找
* 1、必须有序 不管是升序还是降序
* 2、效率比较高
*
* @param args
*/
public static void main(String[] args) {
//int[] arr = {1,2,3,4,5,6,7};
int[] arr = {1,2,3,4,5,6,7,9};
System.out.println(binarySearch(arr, 10));
}
// {1,2,3,4,5,6,7} 10
public static int binarySearch(int[] arr,int num){
int middleIndex = arr.length / 2;
int start= 0,end = arr.length -1;
while(start <= end){
if(arr[middleIndex] > num){
end = middleIndex - 1;
middleIndex = (start + end ) / 2 ;
}
if(arr[middleIndex] < num){
start = middleIndex + 1;
middleIndex = (start + end ) / 2 ;
}
if(arr[middleIndex] == num){
return middleIndex;
}
}
return -1;
}
}
6、Arrays工具类的用法
package com.qfedu.day03_03;
import java.util.Arrays;
/**
* @Author laoyan
* @Description TODO
* @Date 2022/3/3 14:57
* @Version 1.0
*
* Arrays 工具类,专门用来处理数组的工具类
* 里面提供了大量的关于数组的 方法
* copyOf(int[] array, int newLength) 从原数组中拷贝指定数量的元素,到一个新的数组中,并返回这个新的数组
*
* copyOfRange(int[] array, int from, int to) 从原数组中拷贝指定范围 [from, to) 的元素,到一个新的数组中,并返回这个新的数组
*
* equals(int[] array1, int[] array2) 判断两个数组是否相同
*
* fill(int[] array, int element) 使用指定的数据,填充数组
*
* sort(int[] array) 对数组进行排序(升序)
*
* binarySearch(int[] array, int element) 使用二分查找法,到数组中查询指定的元素出现的下标
*
* toString(int[] array) 将数组中的元素拼接成字符串返回
*/
public class Demo03 {
public static void main(String[] args) {
int[] arr ={10,8,12,9,32};
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));
int num = Arrays.binarySearch(arr, 7);
System.out.println(num!=-1 ? "查找到了":"不存在");
// 从一个老的数组中拷贝一份给新数组,如果新数组长度比老数组大,用默认值填充
int[] ints = Arrays.copyOf(arr, 10);
System.out.println(Arrays.toString(ints));
int[] arr2 ={10,8,12,9,32};
int[] arr3 ={10,8,12,9,32};
System.out.println(Arrays.equals(arr3,arr2));// 比较的是两个数组的内容
System.out.println(arr2 == arr3); // 比较的是内存地址
System.out.println(arr2.equals(arr3));// 比较的是内存地址
int[] arr4 = Arrays.copyOfRange(arr3,1,arr3.length);
System.out.println(Arrays.toString(arr4));
// 使用默认值更改里面所有的元素
Arrays.fill(arr3,100);
int[] arr5 = new int[100];
Arrays.fill(arr5,5);
System.out.println(Arrays.toString(arr3));
}
}
7、可变长参数的用法
package com.qfedu.day03_03;
import java.util.Arrays;
/**
* @Author laoyan
* @Description TODO
* @Date 2022/3/3 15:50
* @Version 1.0
*/
public class Demo04 {
public static void show(String name,int ... nums){
System.out.println(name);
System.out.println(nums);
System.out.println(Arrays.toString(nums));
for (int i:nums) {
System.out.println(i);
}
System.out.println(nums.length);
}
/*
可变长参数,只能放在参数列表的最后一位,操作起来跟数组一样。
public static void show(int ... nums,String name){
System.out.println(name);
System.out.println(nums);
System.out.println(Arrays.toString(nums));
for (int i:nums) {
System.out.println(i);
}
System.out.println(nums.length);
}*/
public static void main(String[] args) {
System.out.printf("你的年龄是%d,你的身高是%d",18,210);
show("zhangsan",1,3,5,10);
}
}
8、排序
八大排序算法
1)选择排序
选择排序:固定值与其他值依次比较大小,互换位置。
package com.qfedu.day03_03;
import java.util.Arrays;
/**
* @Author laoyan
* @Description TODO
* @Date 2022/3/3 16:10
* @Version 1.0
*
* 选择排序: 先固定一个位置,然后依次与后面的值比较,如果大于后者小于后者,就交换位置。 // 拿到最大值或者最小值
* 第一轮交换完成之后,固定下一个位置,以后与后年的值比较
*/
public class Demo05 {
public static void main(String[] args) {
int[] arr = {10,8,6,14,19};
for(int m = 0;m < arr.length;m++){
for(int n=m; n< arr.length;n++){
if(arr[m]>arr[n]){
arr[m]= arr[m] ^ arr[n];
arr[n]= arr[m] ^ arr[n];
arr[m]= arr[m] ^ arr[n];
}
}
}
System.out.println(Arrays.toString(arr));
}
}
2) 冒泡排序
冒泡排序:相邻的两个数值比较大小,互换位置
package com.qfedu.day03_03;
import java.util.Arrays;
/**
* @Author laoyan
* @Description TODO
* @Date 2022/3/3 16:25
* @Version 1.0
*/
public class Demo06 {
public static void main(String[] args) {
int[] arr = {10,9,7,5};
int num = arr.length;
for(num=arr.length;num > 1;num--){
for(int m=0;m< num -1 ;m++){
if(arr[m]>arr[m+1]){
arr[m]= arr[m] ^ arr[m+1];
arr[m+1]= arr[m] ^ arr[m+1];
arr[m]= arr[m] ^ arr[m+1];
}
}
System.out.println(Arrays.toString(arr));
}
}
}
package com.qfedu.day03_03;
import java.util.Arrays;
/**
* @Author laoyan
* @Description TODO
* @Date 2022/3/3 16:25
* @Version 1.0
*/
public class Demo06 {
public static void main(String[] args) {
int[] arr = {10,9,7,5};
int num = arr.length;
while(num > 1){
num--;
for(int m=0;m<num;m++){
if(arr[m]>arr[m+1]){
arr[m]= arr[m] ^ arr[m+1];
arr[m+1]= arr[m] ^ arr[m+1];
arr[m]= arr[m] ^ arr[m+1];
}
}
System.out.println(Arrays.toString(arr));
}
}
}
/**
* @Author 千锋大数据教学团队
* @Company 千锋好程序员大数据
* @Description 冒泡排序
*/
public class Test {
public static void main(String[] args) {
// 实例化一个数组
int[] array = { 1, 2, 3, 4, 5 };
// 冒泡排序
sort(array);
}
/**
* 使用冒泡排序进行升序排序
* @param array 需要排序的数组
*/
public static void sort(int[] array) {
// 1. 确定要进行多少趟的比较
for (int i = 0; i < array.length - 1; i++) {
// 2. 每趟比较,从第0位开始,依次比较两个相邻的元素
for (int j = 0; j < array.length - 1 - i; j++) {
// 3. 比较两个相邻的元素
if (array[j] > array[j + 1]) {
int temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
}
}
9、递归
所谓递归:方法自己调用自己,在某个时刻退出。
1) 使用递归计算数的阶乘。
4!= 4 3 2 1
4! = 4 3!
1! = 1
package com.qfedu.day03_04;
/**
* @Author laoyan
* @Description TODO
* @Date 2022/3/3 16:35
* @Version 1.0
*/
public class Demo01 {
/**
* 给定一个值,求这个值的阶乘
*
* 4!= 4 * (4-1)!
* num! = num * (num-1)!
* @param num
* @return
*/
public static int getJieCheng(int num){
if(num == 1){
return 1;
}
return num * getJieCheng(num-1);
}
public static void main(String[] args) {
System.out.println(getJieCheng(4));
}
}
2、求斐波那契数列中的某个数
package com.qfedu.day03_04;
/**
* @Author laoyan
* @Description TODO
* @Date 2022/3/3 16:42
* @Version 1.0
*/
public class Demo02 {
public static int getFeiBo(int index){
// 10 第9个+第8个
if(index == 1 || index == 2){
return 1;
}
return getFeiBo(index-1)+getFeiBo(index-2);
}
// 求斐波那契数列中的某个数
public static void main(String[] args) {
System.out.println(getFeiBo(10));
}
}
10、时间复杂度(了解)