數組的常見算法一

注: 本文來自尚硅谷-宋紅康僅用來學習備份

6.1 數值型數組特征值統計

  • 這里的特征值涉及到:平均值、最大值、最小值、總和等

**舉例1:**數組統計:求總和、均值

public class TestArrayElementSum {public static void main(String[] args) {int[] arr = {4,5,6,1,9};//求總和、均值int sum = 0;//因為0加上任何數都不影響結果for(int i=0; i<arr.length; i++){sum += arr[i];}double avg = (double)sum/arr.length;System.out.println("sum = " + sum);System.out.println("avg = " + avg);}
}

**舉例2:**求數組元素的總乘積

public class TestArrayElementMul {public static void main(String[] args) {int[] arr = {4,5,6,1,9};//求總乘積long result = 1;//因為1乘以任何數都不影響結果for(int i=0; i<arr.length; i++){result *= arr[i];}System.out.println("result = " + result);}
}

**舉例3:**求數組元素中偶數的個數

public class TestArrayElementEvenCount {public static void main(String[] args) {int[] arr = {4,5,6,1,9};//統計偶數個數int evenCount = 0;for(int i=0; i<arr.length; i++){if(arr[i]%2==0){evenCount++;}}System.out.println("evenCount = " + evenCount);}
}

**舉例4:**求數組元素的最大值

1574577970893

public class TestArrayMax {public static void main(String[] args) {int[] arr = {4,5,6,1,9};//找最大值int max = arr[0];for(int i=1; i<arr.length; i++){//此處i從1開始,是max不需要與arr[0]再比較一次了if(arr[i] > max){max = arr[i];}}System.out.println("max = " + max);}
}

**舉例5:**找最值及其第一次出現的下標

public class TestMaxIndex {public static void main(String[] args) {int[] arr = {4,5,6,1,9};//找最大值以及第一個最大值下標int max = arr[0];int index = 0;for(int i=1; i<arr.length; i++){if(arr[i] > max){max = arr[i];index = i;}}System.out.println("max = " + max);System.out.println("index = " + index);}
}

**舉例6:**找最值及其所有最值的下標

public class Test13AllMaxIndex {public static void main(String[] args) {int[] arr = {4,5,6,1,9,9,3};//找最大值int max = arr[0];for(int i=1; i<arr.length; i++){if(arr[i] > max){max = arr[i];}}System.out.println("最大值是:" + max);System.out.print("最大值的下標有:");//遍歷數組,看哪些元素和最大值是一樣的for(int i=0; i<arr.length; i++){if(max == arr[i]){System.out.print(i+"\t");}}System.out.println();}
}

優化

public class Test13AllMaxIndex2 {public static void main(String[] args) {int[] arr = {4,5,6,1,9,9,3};//找最大值int max = arr[0];String index = "0";for(int i=1; i<arr.length; i++){if(arr[i] > max){max = arr[i];index = i + "";}else if(arr[i] == max){index += "," + i;}}System.out.println("最大值是" + max);System.out.println("最大值的下標是[" + index+"]");}
}

**舉例7(難):**輸入一個整形數組,數組里有正數也有負數。數組中連續的一個或多個整數組成一個子數組,每個子數組都有一個和。求所有子數組的和的最大值。要求時間復雜度為O(n)。
例如:輸入的數組為1, -2, 3, -10, -4, 7, 2, -5,和最大的子數組為3, 10, -4, 7, 2,因此輸出為該子數組的和18。

public class Test5 {public static void main(String[] args) {int[] arr = new int[]{1, -2, 3, 10, -4, 7, 2, -5};int i = getGreatestSum(arr);System.out.println(i);}public static int getGreatestSum(int[] arr){int greatestSum = 0;if(arr == null || arr.length == 0){return 0;}int temp = greatestSum;for(int i = 0;i < arr.length;i++){temp += arr[i];if(temp < 0){temp = 0;}if(temp > greatestSum){greatestSum = temp;}}if(greatestSum == 0){greatestSum = arr[0];for(int i = 1;i < arr.length;i++){if(greatestSum < arr[i]){greatestSum = arr[i];}}}return greatestSum;}
}

舉例8:評委打分

分析以下需求,并用代碼實現:

(1)在編程競賽中,有10位評委為參賽的選手打分,分數分別為:5,4,6,8,9,0,1,2,7,3

(2)求選手的最后得分(去掉一個最高分和一個最低分后其余8位評委打分的平均值)

/*** @author 尚硅谷-宋紅康* @create 10:03*/
public class ArrayExer {public static void main(String[] args) {int[] scores = {5,4,6,8,9,0,1,2,7,3};int max = scores[0];int min = scores[0];int sum = 0;for(int i = 0;i < scores.length;i++){if(max < scores[i]){max = scores[i];}if(min > scores[i]){min = scores[i];}sum += scores[i];}double avg = (double)(sum - max - min) / (scores.length - 2);System.out.println("選手去掉最高分和最低分之后的平均分為:" + avg);}
}

6.2 數組元素的賦值與數組復制

**舉例1:**楊輝三角
在這里插入圖片描述
案例:使用二維數組打印一個 10 行楊輝三角。

提示:

  1. 第一行有 1 個元素, 第 n 行有 n 個元素
  2. 每一行的第一個元素和最后一個元素都是 1
  3. 從第三行開始, 對于非第一個元素和最后一個元素的元素。即:
    yanghui[i][j] = yanghui[i-1][j-1] + yanghui[i-1][j];
public class YangHuiTest {public static void main(String[] args) {//1. 創建二維數組int[][] yangHui = new int[10][];//2.使用循環結構,初始化外層數組元素for(int i = 0;i < yangHui.length;i++){yangHui[i] = new int[i + 1];//3. 給數組的元素賦值//3.1 給數組每行的首末元素賦值為1yangHui[i][0] = yangHui[i][i] = 1;//3.2 給數組每行的非首末元素賦值//if(i >= 2){for(int j = 1;j < yangHui[i].length - 1;j++){ //j從每行的第2個元素開始,到倒數第2個元素結束yangHui[i][j] = yangHui[i - 1][j] + yangHui[i - 1][j - 1];}//}}//遍歷二維數組for (int i = 0; i < yangHui.length; i++) {for (int j = 0; j < yangHui[i].length; j++) {System.out.print(yangHui[i][j] + "\t");}System.out.println();}}
}

**舉例2:**使用簡單數組

(1)創建一個名為ArrayTest的類,在main()方法中聲明array1和array2兩個變量,他們是int[]類型的數組。

(2)使用大括號{},把array1初始化為8個素數:2,3,5,7,11,13,17,19。

(3)顯示array1的內容。

(4)賦值array2變量等于array1,修改array2中的偶索引元素,使其等于索引值(如array[0]=0,array[2]=2)。打印出array1。 array2 = array1;

**思考:**array1和array2是什么關系?

**拓展:**修改題目,實現array2對array1數組的復制

snipaste_20220317_225346snipaste_20220317_225359

**舉例3:**一個數組,讓數組的每個元素去除第一個元素,得到的商作為被除數所在位置的新值。

public class Test3 {public static void main(String[] args) {int[] arr = new int[]{12,43,65,3,-8,64,2};//		for(int i = 0;i < arr.length;i++){
//			arr[i] = arr[i] / arr[0];
//		}for(int i = arr.length -1;i >= 0;i--){arr[i] = arr[i] / arr[0];}//遍歷arrfor(int i = 0;i < arr.length;i++){System.out.print(arr[i] + " ");}}
}

**舉例4:**創建一個長度為6的int型數組,要求數組元素的值都在1-30之間,且是隨機賦值。同時,要求元素的值各不相同。

public class Test4 {// 5-67 Math.random() * 63 + 5;@Testpublic void test1() {int[] arr = new int[6];for (int i = 0; i < arr.length; i++) {// [0,1) [0,30) [1,31)arr[i] = (int) (Math.random() * 30) + 1;boolean flag = false;while (true) {for (int j = 0; j < i; j++) {if (arr[i] == arr[j]) {flag = true;break;}}if (flag) {arr[i] = (int) (Math.random() * 30) + 1;flag = false;continue;}break;}}for (int i = 0; i < arr.length; i++) {System.out.println(arr[i]);}}//更優的方法@Testpublic void test2(){int[] arr = new int[6];for (int i = 0; i < arr.length; i++) {// [0,1) [0,30) [1,31)arr[i] = (int) (Math.random() * 30) + 1;for (int j = 0; j < i; j++) {if (arr[i] == arr[j]) {i--;break;}}}for (int i = 0; i < arr.length; i++) {System.out.println(arr[i]);}}
}

**舉例5:**撲克牌

案例:遍歷撲克牌

遍歷撲克牌,效果如圖所示:

1659199523932

提示:使用兩個字符串數組,分別保存花色和點數,再用一個字符串數組保存最后的撲克牌。
String[] hua = {“黑桃”,“紅桃”,“梅花”,“方片”};
String[] dian = {“A”,“2”,“3”,“4”,“5”,“6”,“7”,“8”,“9”,“10”,“J”,“Q”,“K”};

package com.atguigu3.common_algorithm.exer5;/*** @author 尚硅谷-宋紅康* @create 17:16*/
public class ArrayExer05 {public static void main(String[] args) {String[] hua = {"黑桃","紅桃","梅花","方片"};String[] dian = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"};String[] pai = new String[hua.length * dian.length];int k = 0;for(int i = 0;i < hua.length;i++){for(int j = 0;j < dian.length;j++){pai[k++] = hua[i] + dian[j];}}for (int i = 0; i < pai.length; i++) {System.out.print(pai[i] + "  ");if(i % 13 == 12){System.out.println();}}}
}

拓展:在上述基礎上,增加大王、小王。

**舉例6:**回形數

從鍵盤輸入一個整數(1~20) ,則以該數字為矩陣的大小,把1,2,3…n*n 的數字按照順時針螺旋的形式填入其中。

例如: 輸入數字2,則程序輸出:
1 2
4 3

輸入數字3,則程序輸出:
1 2 3
8 9 4
7 6 5
輸入數字4, 則程序輸出:
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7

//方式1
public class RectangleTest {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.println("輸入一個數字");int len = scanner.nextInt();int[][] arr = new int[len][len];int s = len * len;/** k = 1:向右* k = 2:向下* k = 3:向左* k = 4:向上*/int k = 1;int i = 0,j = 0;for(int m = 1;m <= s;m++){if(k == 1){if(j < len && arr[i][j] == 0){arr[i][j++] = m;}else{k = 2;i++;  j--;m--;}}else if(k == 2){if(i < len && arr[i][j] == 0){arr[i++][j] = m;}else{k = 3;i--;j--;m--;}}else if(k == 3){if(j >= 0 && arr[i][j] == 0){arr[i][j--] = m;}else{k = 4;i--;j++;m--;}}else if(k == 4){if(i >= 0 && arr[i][j] == 0){arr[i--][j] = m;}else{k = 1;i++;j++;m--;}}}//遍歷for(int m = 0;m < arr.length;m++){for(int n = 0;n < arr[m].length;n++){System.out.print(arr[m][n] + "\t");}System.out.println();}}
}
//方式2
/*01 02 03 04 05 06 07 24 25 26 27 28 29 08 23 40 41 42 43 30 09 22 39 48 49 44 31 10 21 38 47 46 45 32 11 20 37 36 35 34 33 12 19 18 17 16 15 14 13 */
public class RectangleTest1 {public static void main(String[] args) {int n = 7;int[][] arr = new int[n][n];int count = 0; //要顯示的數據int maxX = n-1; //x軸的最大下標int maxY = n-1; //Y軸的最大下標int minX = 0; //x軸的最小下標int minY = 0; //Y軸的最小下標while(minX<=maxX) {for(int x=minX;x<=maxX;x++) {arr[minY][x] = ++count;}minY++;for(int y=minY;y<=maxY;y++) {arr[y][maxX] = ++count;}maxX--;for(int x=maxX;x>=minX;x--) {arr[maxY][x] = ++count;}maxY--;for(int y=maxY;y>=minY;y--) {arr[y][minX] = ++count;}minX++;}for(int i=0;i<arr.length;i++) {for(int j=0;j<arr.length;j++) {String space = (arr[i][j]+"").length()==1 ? "0":"";System.out.print(space+arr[i][j]+" ");}System.out.println();}}
}

6.3 數組元素的反轉

**實現思想:**數組對稱位置的元素互換。

public class TestArrayReverse1 {public static void main(String[] args) {int[] arr = {1,2,3,4,5};System.out.println("反轉之前:");for (int i = 0; i < arr.length; i++) {System.out.println(arr[i]);}//反轉/*思路:首尾對應位置的元素交換(1)確定交換幾次次數 = 數組.length / 2(2)誰和誰交換for(int i=0; i<次數; i++){int temp = arr[i];arr[i] = arr[arr.length-1-i];arr[arr.length-1-i] = temp;}*/for(int i=0; i<arr.length/2; i++){int temp = arr[i];arr[i] = arr[arr.length-1-i];arr[arr.length-1-i] = temp;}System.out.println("反轉之后:");for (int i = 0; i < arr.length; i++) {System.out.println(arr[i]);}}}

1561469087319

public class TestArrayReverse2 {public static void main(String[] args) {int[] arr = {1,2,3,4,5};System.out.println("反轉之前:");for (int i = 0; i < arr.length; i++) {System.out.println(arr[i]);}//反轉//左右對稱位置交換for(int left=0,right=arr.length-1; left<right; left++,right--){//首  與  尾交換int temp = arr[left];arr[left] = arr[right];arr[right] = temp;}System.out.println("反轉之后:");for (int i = 0; i < arr.length; i++) {System.out.println(arr[i]);}}
}

6.4 數組的擴容與縮容

數組的擴容

題目:現有數組 int[] arr = new int[]{1,2,3,4,5}; ,現將數組長度擴容1倍,并將10,20,30三個數據添加到arr數組中,如何操作?

public class ArrTest1 {public static void main(String[] args) {int[] arr = new int[]{1,2,3,4,5};int[] newArr = new int[arr.length << 1];for(int i = 0;i < arr.length;i++){newArr[i] = arr[i];}newArr[arr.length] = 10;newArr[arr.length + 1] = 20;newArr[arr.length + 2] = 30;arr = newArr;//遍歷arrfor (int i = 0; i < arr.length; i++) {System.out.println(arr[i]);}}
}

數組的縮容

題目:現有數組 int[] arr={1,2,3,4,5,6,7}。現需刪除數組中索引為4的元素。

public class ArrTest2 {public static void main(String[] args) {int[] arr = {1, 2, 3, 4, 5, 6, 7};//刪除數組中索引為4的元素int delIndex = 4;//方案1:/*//創建新數組int[] newArr = new int[arr.length - 1];for (int i = 0; i < delIndex; i++) {newArr[i] = arr[i];}for (int i = delIndex + 1; i < arr.length; i++) {newArr[i - 1] = arr[i];}arr = newArr;for (int i = 0; i < arr.length; i++) {System.out.println(arr[i]);}*///方案2:for (int i = delIndex; i < arr.length - 1; i++) {arr[i] = arr[i + 1];}arr[arr.length - 1] = 0;for (int i = 0; i < arr.length; i++) {System.out.println(arr[i]);}}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/76100.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/76100.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/76100.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

汽車電子筆記之:基于Tasking編譯器怎么制作庫文件并將庫文件集成進工程釋放

目錄 1、概述 2、庫工程創建、使用步驟 2.1、選擇對應的MCU型號及空工程 2.2、選擇需要封裝的代碼 2.3、將需要封裝的代碼復制到庫工程 2.4、整理庫工程工程屬性 2.5、預留不生成庫的.c源文件 2.6、編譯生成.a文件 2.7、將.a集成進工程 2.7.1、創建釋放給客戶的工程 …

[ctfshow web入門] web29

前置知識 eval: 把字符串按照 PHP 代碼來執行&#xff0c;例如eval(“echo 1;”);這個函數擁有回顯 system&#xff1a;使php程序執行系統命令&#xff0c;例如&#xff0c;system(“ls”);就是查看當前目錄&#xff0c;這個擁有回顯 preg_match&#xff1a;查找字符串是否匹配…

7-8 超速判斷

模擬交通警察的雷達測速儀。輸入汽車速度&#xff0c;如果速度超出60 mph&#xff0c;則顯示“Speeding”&#xff0c;否則顯示“OK”。 輸入格式&#xff1a; 輸入在一行中給出1個不超過500的非負整數&#xff0c;即雷達測到的車速。 輸出格式&#xff1a; 在一行中輸出測…

【GESP】C++二級練習 luogu-B3721 [語言月賽202303] Stone Gambling S

GESP二級練習&#xff0c;多層循環分支練習&#xff0c;難度★?☆☆☆。 題目題解詳見&#xff1a;https://www.coderli.com/gesp-2-luogu-b3721/ 【GESP】C二級練習 luogu-B3721 [語言月賽202303] Stone Gambling S | OneCoderGESP二級練習&#xff0c;多層循環分支練習&am…

深入理解C++面向對象特性之一 多態

歡迎來到干貨小倉庫&#xff0c;堪比沙漠!!! 從“Hello World”到改變世界&#xff0c;中間隔著千萬次再試一次. 1.多態的概念 多態的概念&#xff1a;通俗來說&#xff0c;就是多種形態&#xff0c; 具體點就是去完成某個行為&#xff0c;當不同的對象去完成時會 產生出不同的…

藍橋備賽指南(14):樹的直徑與重心

樹的直徑 什么是樹的直徑&#xff1f;樹的直徑是樹上最長的一條鏈&#xff0c;當然這條鏈并不唯一&#xff0c;所以一棵樹可能有多條直徑。直徑由兩個頂點u、v來決定&#xff0c;若由一條直徑&#xff08;u,v)&#xff0c;則滿足一下性質&#xff1a; 1&#xff09;u、v的度數…

AIDD-人工智能藥物設計-網絡藥理學-多組學與網絡藥理學分析揭示龜齡集治療少精癥的機制

IF6.7|多組學與網絡藥理學分析揭示龜齡集治療少精癥的機制 2024年10月28日&#xff0c;海軍軍醫大學張衛東教授團隊在Phytomedicine&#xff08;IF6.7&#xff09;上發表了題為“Multi-omics and network pharmacology approaches reveal Gui-Ling-Ji alleviates oligoastheno…

搜狗拼音輸入法純凈優化版:去廣告,更流暢輸入體驗15.2.0.1758

前言 搜狗輸入法電腦版無疑是裝機必備的神器。它打字精準&#xff0c;詞庫豐富全面&#xff0c;功能強大&#xff0c;極大地提升了輸入效率。最新版的搜狗拼音輸入法更是借助AI技術&#xff0c;讓打字變得既準確又高效。而搜狗輸入法的去廣告精簡優化版&#xff0c;通過移除廣…

Franka雙臂機器人:多領域革新與核心技術深度解析

雙臂Franka機器人以類人化操作能力、毫秒級力控響應及智能協同算法為核心&#xff0c;持續推動工業自動化、醫療輔助與農業生產的革新進程。本文深度解析其技術突破與跨行業實踐案例。 Franka雙臂優勢&#xff1a; 高靈活度&#xff1a;7自由度設計&#xff0c;模擬人類手臂運…

Django視圖詳解

前言 歡迎來到我的博客 個人主頁:北嶺敲鍵盤的荒漠貓-CSDN博客 一、Django視圖是什么&#xff1f; 視圖&#xff08;View&#xff09; 是Django處理HTTP請求的核心組件。它接收一個HttpRequest對象&#xff0c;處理業務邏輯&#xff0c;并返回一個HttpResponse對象&#xff08…

【工具變量】上市公安企業社會信任數據集(2004-2023年)

企業社會信任是衡量企業與社會之間信任度的重要指標&#xff0c;反映了企業在公眾眼中的信譽和可靠性。社會信任對企業的持續發展和品牌形象有著至關重要的影響。本分享數據參考張維迎&#xff08;2002年&#xff09;的做法&#xff0c;采用中國企業家調查系統的地區信任調查數…

Python爬取數據(二)

一.example2包下的 1.re模塊的compile函數使用 import repatternre.compile(r\d) print(pattern) 2.match的方法使用 import re patternre.compile(r\d) # m1pattern.match(one123twothree345four) #參數2&#xff1a;指定起始位置(包含),參數3&#xff1a;終止位置(包含),…

spring之Bean的循環依賴問題、反射機制手寫Spring框架、Spring IoC注解式開發

一、Bean的循環依賴問題 1.什么是Bean的循環依賴 A對象中有B屬性。B對象中有A屬性。這就是循環依賴。我依賴你&#xff0c;你也依賴我。 比如&#xff1a;丈夫類Husband&#xff0c;妻子類Wife。Husband中有Wife的引用。Wife中有Husband的引用。 public class Husband {priv…

狀態機的基本使用

狀態機 1. 什么是狀態機 1.1 場景 在業務代碼中對一些業務狀態進行硬編碼&#xff0c;如果有一天更改了業務邏輯就需要更改代碼&#xff0c;不方便進行系統擴展和維護。 if (status 狀態1) {// TODO } else if(status 狀態2) {// TODO } ...另外對訂單狀態的管理是散落在…

22 | 如何繼續提升 Go 開發技術?

提示&#xff1a; 所有體系課見專欄&#xff1a;Go 項目開發極速入門實戰課&#xff1b;歡迎加入 云原生 AI 實戰營 星球&#xff0c;12 高質量體系課、20 高質量實戰項目助你在 AI 時代建立技術競爭力&#xff08;聚焦于 Go、云原生、AI Infra&#xff09;。 「Go 項目開發極速…

LLM Agents項目推薦:MetaGPT、AutoGen、AgentVerse詳解

這一部分我們將深入介紹三大備受關注的LLM Agents項目&#xff1a;MetaGPT、AutoGen和AgentVerse&#xff0c;包括它們的背景、設計思路、主要功能、技術亮點以及典型應用場景。 1. MetaGPT&#xff1a;讓AI像軟件工程團隊一樣協作 項目背景 MetaGPT由Huang et al.于2023年提…

好數(藍橋杯2024省賽B組)

題目描述 一個整數如果按從低位到高位的順序&#xff0c;奇數位&#xff08;個位、百位、萬位……&#xff09;上的數字是奇數&#xff0c;偶數位&#xff08;十位、千位、十萬位……&#xff09;上的數字是偶數&#xff0c;我們就稱之為“好數”。 給定一個正整數 N&#xf…

STM32單片機入門學習——第26節: [9-2] USART串口外設

寫這個文章是用來學習的,記錄一下我的學習過程。希望我能一直堅持下去,我只是一個小白,只是想好好學習,我知道這會很難&#xff0c;但我還是想去做&#xff01; 本文寫于&#xff1a;2025.04.08 STM32開發板學習——第26節: [9-2] USART串口外設 前言開發板說明引用解答和科普…

【學Rust寫CAD】31 muldiv255函數(muldiv255.rs,已經取消)

源碼 // Calculates floor(a*b/255 0.5) #[inline] pub fn muldiv255(a: u32, b: u32) -> u32 {// The deriviation for this formula can be// found in "Three Wrongs Make a Right" by Jim Blinn.let tmp a * b 128;(tmp (tmp >> 8)) >> 8 }代…

LLM+js實現大模型對話

代碼運行效果圖&#xff1a;前提是你有一個可用的openai服務&#xff0c;然后用下面一個html頁即可啟動 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthd…