1. 程式人生 > >java實現——8硬幣問題(演算法)

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.棧      棧也叫堆疊,是一種限制只能在某一端進行插入和刪除操作的線性表