第4週週報

-咕嚕咕嚕.發表於2020-12-11

一、java基礎

二、啊哈演算法

三、複習連結串列

java基礎

1.構造方法:
作用:構造方法是專門用來建立物件的方法,當我們通過關鍵字new來建立物件時,其實就是在呼叫構造方法。
格式: 方法的名字必須和類的名字完全一致。構造方法不允許寫返回值型別,void也不能寫。命名格式如下

public 類名稱(引數型別 引數名稱) {
    方法體
}

注意事項:
1.構造方法的名稱要跟所在的類名稱一模一樣,包括大小寫。
2.構造方法沒有返回值型別,連void都不能寫。
3.構造方法不能rerturn一個具體的值作為返回值。
4.如果沒有編寫構造方法,編譯器會預設贈送一個構造方法:public Student(){}
5.如果寫了至少一個構造方法,編譯器將不再贈送。
6.構造方法也能進行過載(方法名稱相同,引數列表不同)
測試程式碼:

定義類:

package day4;

public class Student {
    private int age;
    private String name;
    public Student(){
        System.out.println("無引數的構造方法執行!");
    }
    public Student(int age,String name){
        this.age = age;
        this.name = name;
        System.out.println("全引數的構造方法執行!");
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getAge() {
        return age;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

main方法:

package day4;

public class student01 {
    public static void main(String[] args) {
        Student st1 = new Student();
        Student st2 = new Student(20,"小娟");
        System.out.println("姓名:"+st2.getName());
        System.out.println("年齡:"+st2.getAge());
        st2.setAge(22);
        st2.setName("盧文慧");
        System.out.println("姓名:"+st2.getName());
        System.out.println("年齡:"+st2.getAge());
    }
}

2.匿名物件
作用:經常和Scanner連用。
在這裡插入圖片描述

在這裡插入圖片描述
3.random
題目1:隨機生成1~n範圍的隨機數。
方法:整體+1即可。
在這裡插入圖片描述
題目2:猜數(淼)
直接程式碼:

package day5;

import java.util.Random;
import java.util.Scanner;

public class useRandom03 {
    public static void main(String[] args) {
        int a = new Random().nextInt(5);
        /*System.out.println("請輸入猜的數字:");
        int guess = new Scanner(System.in).nextInt();
        if(guess==a)
            System.out.println("猜對啦");
        else if(guess<a)
            System.out.println("猜小了");
        else
            System.out.println("猜大了");*/
        while(true){
            System.out.println("請輸入猜的數字:");
            int guess = new Scanner(System.in).nextInt();
            if(guess==a) {
                System.out.println("猜對啦");
                break;
            }
            else if(guess<a)
                System.out.println("猜小了");
            else
                System.out.println("猜大了");

        }
    }
}

4.物件陣列
重點:物件陣列裡面的元素存放的是物件的地址值

package day5;

public class Arry {
    public static void main(String[] args) {
        Person[] arr = new Person[3];
        Person one = new Person(28,"迪麗熱巴");
        Person two = new Person(18,"古力娜扎");
        Person three = new Person(30,"馬兒扎哈");
        arr[0] = one;
        arr[1] = two;
        arr[2] = three;
        System.out.println(arr[0].getName()+" 年齡:"+ arr[0].getAge());
        System.out.println(arr[1].getName()+" 年齡:"+ arr[1].getAge());
        System.out.println(arr[2].getName()+" 年齡:"+ arr[2].getAge());
    }
}

比如arr[0] = one中就是把one裡面存放的地址值賦給了arr【0】所以後面才能用arr[0].age.

5.ArryList
格式:ArrayList list = new ArrayList<>();
1.常用方法:
在這裡插入圖片描述
演示:

package day5;

import java.util.ArrayList;

public class demoArryList {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("迪麗熱巴");
        list.add("古力娜扎");
        list.add("馬爾扎哈");
        System.out.println(list);
        String a = list.get(0);
        System.out.println(a);
        list.remove(2);
        System.out.println(list);
        int size = list.size();
        System.out.println(size);
        //遍歷集合:
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
    }
}

題目1.新增隨機數

package day5;

import java.util.ArrayList;
import java.util.Random;

public class addRandomTOArryList {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        for (int i = 0; i < 6; i++) {
            list.add(new Random().nextInt(33)+1);

        }
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
    }

}

題目2.新增物件到集合:自定義四個學生物件新增到集合,並遍歷。

package day5;

import java.util.ArrayList;

public class solutionaddstudent {
    public static void main(String[] args) {
        Student one = new Student("趙麗穎",20);
        Student two = new Student("迪麗熱巴",22);
        Student three = new Student("古力娜扎",26);
        Student four = new Student("馬爾扎哈",200);
        ArrayList<Student> list = new ArrayList<>();
        list.add(one);
        list.add(two);
        list.add(three);
        list.add(four);
        for (int i = 0; i < 4; i++) {
            System.out.println(list.get(i).getName()+" 年齡:"+list.get(i).getAge());
        }

    }
}

題目三:格式化輸出集合(淼)

package day5;

import java.util.ArrayList;

public class PrintArrylist {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        list.add(10);
        list.add(20);
        list.add(30);
        printArryList(list);

    }
    public static void printArryList(ArrayList<Integer> a){
        for (int i = 0; i < a.size(); i++) {
            System.out.print("{");
            if(i==0) {
                System.out.print(a.get(i));
            }
            else
            System.out.print("@"+a.get(i));
            if(i==a.size()-1){
                System.out.print("}");
            }
        }
    }
}

題目4.:篩選集合元素

package day5;

import java.util.ArrayList;
import java.util.Random;

public class ChoseArryList {
    public static void main(String[] args) {
        ArrayList<Integer> list1 = new ArrayList<>();
        for (int i = 0; i < 20; i++) {
            list1.add(new Random().nextInt());
        }
        System.out.println(list1);
        System.out.println("----------------------------");
        ArrayList<Integer> list2 = new ArrayList<>();
        for (int i = 0; i < 20; i++) {
            if(selectArryList(list1.get(i)))
                list2.add(list1.get(i));
        }
        System.out.println(list2);

    }
    public static boolean selectArryList(int num){
        if(num%2==0)
            return true;
        else
            return false;
    }

}

6.字串*******

重點:

在這裡插入圖片描述
字串變數儲存的是地址值,指向的是堆中的字元陣列。
對字串變數進行修改實際上修改的是地址值,讓其指向另一個字元陣列,但是上一個字串的內容沒有改變。

1.字串的建立:在這裡插入圖片描述

重點:3種構造方法:

package day5;

public class DemoString {
    public static void main(String[] args) {
        String str1 = new String();//空參構造方法
        System.out.println("字串1是:"+str1);
        char[] ch = new char[] {'A','B','C'};//字元陣列構造方法
        String str2 = new String(ch);
        System.out.println("字串2是:"+str2);
        byte[] by = new byte[]{97,98,99};//底層位元組陣列構造方法
        String str3 = new String(by);
        System.out.println("字串3是:"+str3);
    }
}

2.字串常量池
問題:為什麼st1st2為true而st2st3和st1st3為false?
在這裡插入圖片描述
1.字串常量池:
程式當中直接寫上的雙引號字元都只出現在字串常量池中(在堆中),而用其他構造方法寫的字串都出現在堆中。
**2.對於基本型別來說
是進行數值的比較,而對於引用型別來說==是進行地址的比較**。
也就是說st1和st2儲存的地址值相等而和st3不等。
記憶體情況:
在這裡插入圖片描述
3.字串的內容比較方法**
在這裡插入圖片描述
詳細內容看程式碼裡面的註釋

package day5;

public class DemoEquals {
    public static void main(String[] args) {
        String st1 = "hello";
        String st2 = "hello";
        char[] ch = {'h','e','l','l','o'};
        String st3 = new String(ch);
        System.out.println(st1.equals(st2));
        System.out.println(st2.equals(st3));
        System.out.println("hello".equals(st3));//字串常量也可以直接.equals
        /*注:當一個字串常量和一個字串變數比較時,推薦寫常量.equals(變數名),就比如上一行的程式碼
             為什麼?
             如果上寫 :變數名.equals(常量)
             當變數為null時會出現空指標問題,會報錯。因為變數為空指標時不能用 變數.的操作
             String st4 = null;
            System.out.println("hello".equals(st4));
            System.out.println(st4.equals("hello"));
        */
        System.out.println("HELLO".equalsIgnoreCase(st2));//忽略大小的的比較方法。

    }
}

4.字串的常用獲取方法

在這裡插入圖片描述
具體實現看程式碼

package day5;

public class DemoGetString {
    public static void main(String[] args) {
        String st1 = "hello";
        String st2 = "world";
        String st3 = st1.concat(st2);//字串的拼接:concatenate
        System.out.println(st3);
        char ch = st1.charAt(1);//查詢索引位置的字元
        System.out.println(ch);
        int i ="qeqweqweqrqwetrkwjkladm,x,.Zc/".length();//返回字串的長度
        System.out.println(i);
        int num = st1.indexOf("ll");//返回引數裡面的字串在原來字串中第一次出現的索引值,如果沒有出現返回-1.
        System.out.println(num);
    }
}

5.字串的擷取方法substring()
詳細內容看程式碼:

package day5;

public class Demosubstring {
    public static void main(String[] args) {
        String st1 = "helloworld";
        String st2 = st1.substring(5);//從索引值到字串的末尾進行擷取
        System.out.println(st2);
        String st3 = st1.substring(4,7);//從4~6的索引值進行擷取範圍是【a,b).
        System.out.println(st3);
    }
}

6.字串的轉化convert
在這裡插入圖片描述
詳細內容看程式碼:

package day5;

public class DemoConvertString {
    public static void main(String[] args) {
        String st1 = "hello";
        //將字串轉化為字元陣列
        char[] ch = st1.toCharArray();
        for (int i = 0; i < ch.length; i++) {
            System.out.println(ch[i]);
        }
        System.out.println("=================");
        //將字串轉化為底層的二進位制陣列
        byte[] by = st1.getBytes();
        for (int i = 0; i < by.length; i++) {
            System.out.println(by[i]);
        }
        System.out.println("===============");
        //將字串中的某個部分用新的字串替代
        String st2 = "傻逼東西,你媽死了?";
        String st3 = st2.replace("傻逼","*");
        String st4 = st3.replace("你媽","*");
        String st5 = st1.replace("o","*");
        System.out.println(st5);
        System.out.println(st3);
        System.out.println(st4);

    }
}

7.字串的分割
在這裡插入圖片描述
注意:圖片裡面的注意事項。
具體操作看程式碼:

package day5;

public class DemoSplitString {
    public static void main(String[] args) {
        String st1 = "aaa,bbb,ccc";
        String[] arr1 = st1.split(",");
        for (int i = 0; i < arr1.length; i++) {
            System.out.println(arr1[i]);
        }
        System.out.println("==================");
        String st2 = "aaa.bbb.ccc";
        String[] arr2 = st2.split("\\.");//當以“.”分割時用“\\.”;
        for (int i = 0; i < arr2.length; i++) {
            System.out.println(arr2[i]);
        }

    }
}

8.練習
1.拼接字串
注:對字串來說“+”是進行拼接。跟sout裡面的+是一個原理。

package day5;

public class solutionConcateString {
    public static void main(String[] args) {
        int[] arr = {1,2,3};
        String st = getString(arr);
        System.out.println(st);
    }
    public static String getString(int[] arr){
        String st = "[";
        for (int i = 0; i < arr.length; i++) {
            if(i==arr.length-1)
                st+="world"+arr[i]+"]";
            else
                st+="world"+arr[i]+"#";
        }
        return st;
    }
}

2.統計各種型別的字元在字串中出現的次數
直接看程式碼:
我的:將字串轉化為yte陣列然後用對應的數字進行判斷

package day5;

import java.util.Scanner;

public class solutionStringKindCount {
    public static void main(String[] args) {
        System.out.println("請輸入字串:");
        String st = new Scanner(System.in).next();
        int xiaoxie = 0;
        int daxie = 0;
        int num = 0;
        int qita = 0;
        byte[] by = st.getBytes();
        for (int i = 0; i < by.length; i++) {
            if(by[i]<97&&by[i]>=65)
                daxie++;
            else if(by[i]>=97&&by[i]<129)
                xiaoxie++;
            else if(by[i]>=48&&by[i]<65)
                num++;
            else
                qita++;
        }
        System.out.println("小寫:"+xiaoxie);
        System.out.println("大寫"+daxie);
        System.out.println("數字:"+num);
        System.out.println("其他"+qita);
    }
}

視訊上的:將字串轉化為字元陣列,與‘a’‘z’‘A’'Z’等進行比較,因為字元型別在進行運算時(包括比較大小,會自動提升稱為int型別)
在這裡插入圖片描述

7.static(學起來很繞)

視訊中的重點:
1.靜態不能訪問非靜態。
原因:因為在記憶體中先有的靜態內容,後有的非靜態內容。
理解:靜態內容是屬於類的。直接使用類名稱就能呼叫,而非靜態需要通過物件才能呼叫(非靜態屬於物件),如果一個靜態呼叫了非靜態(屬於物件的東西),系統就會不知所措(不知該使用哪一個物件的屬性)。
在這裡插入圖片描述

別人的東西:主要講了靜態成員變數
非常詳細
靜態記憶體圖:
在這裡插入圖片描述
重點:靜態變數通過類名稱訪問,全程和物件沒有關係。
靜態程式碼塊
在這裡插入圖片描述
**
8.Arrays
在這裡插入圖片描述
toString方法是將一個陣列按照預設格式轉化為字串,能夠直接sout輸出。
看程式碼:

package day6;

import java.util.ArrayList;
import java.util.Arrays;

public class DemoArrys {
    public static void main(String[] args) {
        String[] st = {"abc","aaa","bcd"};
        Arrays.sort(st);
        System.out.println(st);
        System.out.println(Arrays.toString(st));
    }
}

題目:(淼)將一個隨機字串中的字元升序排列,然後倒序輸出
直接上程式碼:

package day6;

import java.util.Arrays;

public class SolutionArrays {
    public static void main(String[] args) {
        String st = "adadgfgdfhdhdgg";
        char[] ch = st.toCharArray();
        Arrays.sort(ch);
        for (int i = ch.length-1; i >=0; i--) {
            System.out.print(ch[i]);
        }
    }
}

9.數學工具類Math
在這裡插入圖片描述
題目(淼)

package day6;
/*
計算在-10.8~5.9之間絕對值大於6或小於2.1的整數有多少個
*/
public class SolutionMath {
    public static void main(String[] args) {
        int cnt = 0;
        double i = Math.ceil(-10.8);
        double j = Math.floor(5.9);
        for(int n = (int)i;n<=j;++n){
            if(Math.abs(n)>6||Math.abs(n)<2.1)
                ++cnt;
        }
        System.out.println(cnt);
    }
}

10.繼承

繼承的概述:
在這裡插入圖片描述
繼承主要解決的問題是:共性抽取。
格式:
在這裡插入圖片描述

成員變數的訪問:
在這裡插入圖片描述
區分三種重名:
新:super.成員變數 代表父類的那個成員變數。
在這裡插入圖片描述
具體例子:
在這裡插入圖片描述
成員方法的訪問規則:
在這裡插入圖片描述

覆蓋重寫

1.規則
在這裡插入圖片描述

2.繼承的理解(用處)

在這裡插入圖片描述
具體的程式碼例子:(super.show是用來繼承原來手機中show方法的內容)
在這裡插入圖片描述
父子類構造方法的訪問特點:
在這裡插入圖片描述
super關鍵字的三種用法:圖片中很詳細
在這裡插入圖片描述
繼承的三大特點:
在這裡插入圖片描述

抽象:

1.抽象方法和抽象類的格式:

在這裡插入圖片描述

二、啊哈演算法

**
1.快速排序
感覺也沒什麼好特殊說明的,直接來程式碼:
C語言:

# include<stdio.h>

int a[101];
int n;

void quicksort(int left,int right)
{
	int temp,t,i,j;
	if(left>right)
	return;
	i = left;
	j = right;
	temp = a[left];
	while(i!=j)
	{
		while(a[j]>=temp && i<j)
		j--;
		while(a[i]<=temp && i<j)
		i++;
		if(i<j)
	   {
		  t = a[i];
		  a[i] = a[j];
		  a[j] = t;
       }
	}
	a[left] = a[i];
	a[i] = temp;
	quicksort(left,i-1);
	quicksort(i+1,right);
}
int main(void)
{
	printf("請輸入長度:\n");
	scanf("%d",&n);		
	int i;
	for(i = 1;i<=n;++i)
	{
		printf("第%d個資料是:\n",i);
		scanf("%d",&a[i]); 
	}
	quicksort(1,n);
	printf("====================\n");
	for(i = 1;i<=n;++i)
	{
		printf("%d ",a[i]); 
	}
	
	return 0;
} 

java:

package day6;

import java.util.Scanner;

public class quicksort {
    public static void main(String[] args) {
        System.out.println("請輸入長度");
        int n = new Scanner(System.in).nextInt();
        int[] arr = new int[n];
        for (int i = 0; i < arr.length; i++) {
            System.out.println("第"+(i+1)+"個數是:");
            arr[i] = new Scanner(System.in).nextInt();
        }
        qsort(arr,0,n-1);
        System.out.println("=================================");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]+" ");
        }

    }
    public static void qsort(int[] a,int left,int right){
        int t,temp,i,j;
        if(left>right)
            return;

        temp = a[left];
        i = left;
        j = right;
        while(i!=j){
            while(a[j]>=temp&&i<j)
                j--;
            while(a[i]<=temp&&i<j)
                i++;
            if(i<j) {
                t = a[i];
                a[i] = a[j];
                a[j] = t;
            }
        }
        a[left] = a[i];
        a[i] = temp;

        qsort(a,left,i-1);
        qsort(a,i+1,right);
    }
}

題目:第四節:小哼買書:

p21
改題目的關鍵就是去重。
有兩種方法:
1.去重在排序。(桶排序的思想)。
2.先排序再去重(挨個遍歷,如果該元素與它之前的元素的值不相等就列印)
上程式碼:
1.

# include<stdio.h>
int main(void)
{
	int a[1001] = {};
	int i,n,j,cnt = 00;
	scanf("%d",&n);
	for(i = 0;i<n;++i)
	{
		scanf("%d",&j);
		a[j] = j;
	}
	for(i = 1;i<=1000;++i)
	{
		if(a[i]!=0)
		{
			++cnt;
			printf("%d\n",i);
		}
	}
	printf("%d\n",cnt);
	return 0;
} 
# include<stdio.h>
int main(void)
{
	int a[101];
	int n;
	scanf("%d",&n);
	for(i = 0;i<n;++i)
	{
		scanf("%d",&a[i]);
	}
	for(i = 0;i<n-1;++i)
	{
		for(j = 0;j<n-1-i;++j)
		{
			if(a[j]>a[j+1])
			{
				t = a[j];
				a[j] = a[j+1];
				a[j+1] = t;
			}
		}
	}
	printf("%d",a[0]);//先列印第一個,從第二個開始判斷 
	for(i = 1;i<=n;++i)
	{
		if(a[i]!=a[i-1])
		printf("%d",a[i]);
	}
	
	return 0;
}