java實現——8硬幣問題(演算法)
程式碼看著有點亂,有點複雜!單步除錯一下其實不復雜!當然前提是要搞清楚演算法的思想!
package yxd.sf.eightcoins; public class EightCoins { public static int compareTo(int[] coins, int[] left, int[] right) { int leftTotal = 0; int rightTotal = 0; int fakeCoin = 0; int coinsSize = 0; if (coins.length % 2 == 0) { coinsSize = coins.length/2; //將現在的硬幣分成兩半 System.arraycopy(coins, 0, left, 0, coinsSize); //前一半硬幣放到left for (int i = 0; i < coinsSize; i++) { leftTotal = leftTotal + left[i]; //前一半硬幣的總重量 } System.arraycopy(coins, coinsSize, right, 0, coinsSize); //後一半硬幣放到right for (int j = 0; j < coinsSize; j++) { rightTotal = rightTotal + right[j]; //後一半硬幣的總重量 } } //比較right和left兩邊的硬幣重量 if (leftTotal < rightTotal && coinsSize != 1) { coins = right; int[] right_1 = new int[coinsSize/2]; int[] left_1 = new int[coinsSize/2]; right = right_1; //動態改變陣列大小,減治後硬幣減半 left = left_1; System.arraycopy(coins, 0, left, 0, coinsSize/2); System.arraycopy(coins, coinsSize/2, right, 0, coinsSize/2); } else if (leftTotal > rightTotal && coinsSize != 1) { coins = left; int[] right_1 = new int[coinsSize/2]; int[] left_1 = new int[coinsSize/2]; right = right_1; left = left_1; System.arraycopy(coins, 0, left, 0, coinsSize/2); System.arraycopy(coins, coinsSize/2, right, 0, coinsSize/2); } if (left.length != 1 && right.length != 1 && fakeCoin == 0) { fakeCoin = compareTo(coins, left, right); //遞迴呼叫,如果不令“fakeCoin=”最終返回會為0 } if (left.length == 1 && right.length == 1 && coinsSize == 2) { if (left[0] < right[0]) { fakeCoin = right[0]; } else if (left[0] == right[0]){ System.out.println(left[0] + "and" + right[0]); } else { fakeCoin = left[0]; } } return fakeCoin; } public static void main(String[] args) { int[] coins = {1, 1, 1, 2, 1, 1, 1, 1}; int[] left = new int[4]; int[] right = new int[4]; int flag = 0; int location = compareTo(coins, left, right); for (int i = 0; i < coins.length; i++) { flag++; if (coins[i] == location) { System.out.println("第" + flag + "枚硬幣為假幣!"); } } } }
相關推薦
java實現——8硬幣問題(演算法)
程式碼看著有點亂,有點複雜!單步除錯一下其實不復雜!當然前提是要搞清楚演算法的思想! package yxd.sf.eightcoins; public class EightCoins { public static int compareTo(int[] coi
java實現post請求(PostMethod)
postmethod json項目要求:實現post請求,且請求格式是json格式。maven依賴包<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>ht
用Java實現AES加密(轉)
密鑰 工具 mex 嚴格 keys 生產 ner for 創建 一)什麽是AES? 高級加密標準(英語:Advanced Encryption Standard,縮寫:AES),是一種區塊加密標準。這個標準用來替代原先的DES,已經被多方分析且廣為全世界所使用。 那麽為什麽
java實現8 大排序演算法,不求最簡單,只求最容易理解
8 大排序演算法 排序演算法可以分為內部排序和外部排序,內部排序是資料記錄在記憶體中進行排序,而外部排序是因排序的資料很大,一次不能容納全部的排序記錄,在排序過程中需要訪問外存。 常見的內部排序演算法有:插入排序、希爾排序、選擇排序、氣泡排序、歸併排序、快速排序、堆排序、基數排序等。
Java後端面試題(演算法)
1、寫⼀個字串反轉函式。 方法一:(利用遞迴實現) public static String reverse1(String s) { int length = s.length(); if (length <= 1) return s; Strin
Java實現插入排序(三)
原理:每一步將一個待排序的記錄,插入到前面已經排好序的有序序列中去,直到插完所有元素為止。 思想:想必你肯定打過撲克牌吧,在一張一張揭牌的時候,是不是每次揭一張牌將其插入到其他已經有序的牌中的適當位置,如果你沒有這個經歷,趕緊約一波小夥伴,鬥一把。與選擇排序一樣,把要排序的
一種簡單的用java實現快速排序(Quicksort)
1,快速排序(Quicksort)是對氣泡排序的一種改進。對資料量越大,資料分佈越混亂的,一般認為是效能最好的。快排是分治思想的一種體現,把大的問題細化成小問題,把小問題細化成更小的問題,最終把問題縮小到一定規模內,可解決。 2,快排演算法思路就是,先取一個數作為關鍵資料(key一般
java實現郵箱驗證(一)
需求:使用者註冊時給郵箱傳送郵件,得到驗證碼並填寫,進行啟用郵箱。 有基礎的可以直接看下篇:https://blog.csdn.net/BlackPlus28/article/details/85114001 首先一步一步來寫,這篇是以java簡單的傳送郵件 一、設定發件人的郵箱和密碼等
Java實現氣泡排序(一)
原理:每次比較兩個相鄰的元素,將較大的元素交換至右端。 思路:每次氣泡排序操作都會將相鄰的兩個元素進行比較,看是否滿足大小關係要求,如果不滿足,就交換這兩個相鄰元素的次序,一次冒泡至少讓一個元素移動到它應該排列的位置,重複N次,就完成了氣泡排序。 通過一個圖來簡單理解一下
教你如何一步一步用Java實現飛機大戰(一)
資源交流群 飛機大戰第一天 1.抽象類:飛行物 public abstract class FlyingObject{ protected BufferedImage image; protected int width; //寬 protected int h
排序演算法Java實現——選擇排序(直接選擇排序)
比較排序程式碼: /*@(#)chooseSort.java 2017-4-22 * Copy Right 2017 Bank of Communications Co.Ltd. * A
經典資料結構及演算法-Java實現-附原始碼(可下載)
閒暇之餘,將自己之前敲過的資料結構與演算法程式碼整理了一下,最後放在一個工程下面:具體分類:剛看了下專案目錄,少了排序分類介紹圖,在這裡補上(此圖來源於網上)最後,程式碼比較多,只展示下排序演算法的程式碼。package com.lzz.algorithm.sorting;
Java實現AOP切面(動態代理)
定義 row ack tcl getc java的反射機制 div implement reat Java.lang.reflect包下,提供了實現代理機制的接口和類: public interface InvocationHandler InvocationHandl
Java 8實戰 (筆記)第一章
family 內容 列數 poi red left 推廣 exc collect 流是一系列數據項,一次只生成一項。 Java 8新增的編程概念:流處理,通過API來傳遞代碼,函數式編程。 ::語法:"把這個方法作為值"。 函數式編程風格:編寫把函數作為一等值的程序。
Java課程設計---實現登錄(2)
mage dax stat 2018年 const SQ getc RF ktr 前面已經完成了登錄界面的設計,單擊確認按鈕可以獲取輸入的用戶名和密碼,下面來將演示實現真實的登錄(輸入值和數據庫的比對) 1、設計“登錄服務” 通常我們根據業務關系,對相應的操作人員提
使用java實現快速排序(我認為是最簡單最容易理解的版本)
一切都在程式碼和註釋之中。複製貼上就能跑,邊跑邊看才是最愉快的。 所以,話不多說,放碼過來。 public class QuickSort { public static void main(String[] args) { int x[]={6,1,2,7,9,1
JAVA實現郵件驗證(註冊功能中使用)
原始碼: 連結:https://pan.baidu.com/s/1iSRybqDdzYU8apEs1OtQBw 提取碼:q0gb 易郵 and foxmail 連結:https://pan.baidu.com/s/1woOxn-UjmoALCQDjFuGAQQ&n
Java 一維陣列實現一個棧(Stack)類
使用一維陣列編碼實現一個棧(Stack)類,要求提供以下操作:(1)boolean isEmpty():判斷棧當前是否為空;(2)入棧操作void push(obj):把資料元素obj插入堆疊;(3)出棧操作Object pop():出棧,並返回刪除的資料元素;(4)Object get
演算法實現:歸併(合併)排序(C/C++、Python)
合併排序的關鍵步驟在於合併步驟中的合併兩個已排序子序列。為做合併,引入一個輔助過程MERGE(A, p, q, r), 其中A是一個數組,p、q和r是下標,滿足p小於等於q小於r。該過程假設子陣列A[p...q] 和A[q+1...r]都已排好序,並將它們合併成一個已排好序的子陣列代替當前子陣列
資料結構3--棧(java實現棧的順序儲存)
1.棧 棧也叫堆疊,是一種限制只能在某一端進行插入和刪除操作的線性表