蘑菇街技術筆試編程題


寫在前面

1、第一題

題目描述

現有一個n個整數的序列,你要做的就是交換兩個數的位置直到整個序列按照升序排列,那么將這個整數序列排好序,需要交換多少次?例如,1,2,3,5,4,我們只需要交換一次,即將5和4交換即可。

輸入
輸入第一行為測試數據組數T(0<T<1000)
接下來輸入一個正整數n(n≤1000),表示數字序列的元素個數,占一行;
接下來一行輸入從1到n的n個整數排序,中間用空格隔開
輸出
序列升序排列需要的最少交換次數

樣例輸入
2
3
1 2 3
4
4 3 2 1
樣例輸出
0
6

題目分析

冒泡排序是一種簡單的排序算法。它重復地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重復地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個算法的名字由來是因為越小的元素會經由交換慢慢“浮”到數列的頂端。

這道題明顯是考察冒泡排序,記錄交換次數。

代碼如下:

import java.util.Scanner;

public class Main {
	
	public static int bubbleSort(int[] nums) {
		if (null == nums)
			return -1;
		int count = 0;
		for (int i = 0; i < nums.length; i++) {
			for (int j = nums.length - 1; j > i; j--) {
				if (nums[j] < nums[j - 1]) {
					swap(nums, j, j - 1);
					count++;
				}
			}
		}
		return count;
	}

	public static void swap(int[] nums, int i, int j) {
		int tmp = nums[i];
		nums[i] = nums[j];
		nums[j] = tmp;
	}
	
	public static void main(String args[]) {
		Scanner cin = new Scanner(System.in);
		while (cin.hasNext()) {
			int T = cin.nextInt();
			for (int i = 1; i <= T; i++) {
				int n = cin.nextInt();
				int[] num = new int[n];
				for(int j = 0;j<n;j++){
					num[j] = cin.nextInt();
				}
				int res = bubbleSort(num);
				System.out.println(res);
			}

		}
		cin.close();
	}
}

重點來了,我提交的結果是通過90%的測試,我感覺可能是一些邊界條件沒有考慮。但是思考很久,還是沒找到問題所在。

歡迎各路大神給出意見。

1、第一題

題目描述

Arthur買了新桌子,桌子有很多條桌腿支撐,可是回家后發現桌子不穩,原來是桌子腿長度不太相同,他想要自己把桌子修理好,所以他決定移除掉一些桌腿來讓桌子變得平穩。桌子腿共n條腿,第i條腿長度為l_i,Arthur移除第i桌腿要花費代表為d_i。假設k條腿桌子平穩的條件:超過一半桌腿能夠達到桌腿長度的最大值。例如:一條腿的桌子是平穩的,兩條腿的桌子腿一樣長時是平穩的。請你幫Arthur計算下桌子變平穩的最小總代價。

輸入
第一行是一整數:n(1 <= n <= 10^5),n表示桌腿總數
第二行數據是n個整數:l_1,l_2,...,l_n(1 <= l_i <= 10^5),表示每條桌腿的長度
第三行數據是n個整數:d_1,d_2,...,d_n(1 <= d_i <= 200),表示移除每條腿的代價

輸出
讓桌子變平穩的最小總代價

樣例輸入:
6
2 2 1 1 3 3
4 3 5 5 2 1

輸出
8

題目分析

  1. 按桌腿長度進行排序,對應的代價數組也進行交換,保證一一對應。
  2. 從最高的桌腿長度len開始,如果選取最高桌腿長度為len,如果長度為len的桌腿超過一半,則代價為0,在剩余桌腿里進行移除,按代價從小到大,只要滿足長度為len的桌腿超過一半,就可停止。
  3. 每次選擇一個高度h作為最高高度,注意,當h作為最高高度時,所以比h大的桌腿已經移除,然后計算在比h低的桌腿里移除,以滿足長度為h的桌腿超過一半

代碼如下:
寫的有點亂。

import java.util.Arrays;
import java.util.Scanner;

public class Main {

	public static void bubbleSort(int[] a, int[] b) {
		if (null == a)
			return;
		for (int i = 0; i < a.length; i++) {
			for (int j = a.length - 1; j > i; j--) {
				if (a[j] < a[j - 1]) {
					swap(a, j, j - 1);
					swap(b, j, j - 1);
				}
			}
		}
	}

	public static void swap(int[] nums, int i, int j) {
		int tmp = nums[i];
		nums[i] = nums[j];
		nums[j] = tmp;
	}

	public static int countCost(int[] a, int[] b) {
		int cost = 0;
		int min = Integer.MAX_VALUE;
		int maxHigh = a[a.length - 1];
		int post = b[a.length - 1];
		int before = 0;
		int cnt = 0;
		for (int i = a.length - 2; i >= 0; i--) {
			while (i >= 0 && maxHigh == a[i]) {
				post += b[i];
				i--;
				cnt++;
			}
			cost = cntCostpart(b, 0, i, before, cnt);
			before = post;
			if (min > cost)
				min = cost;
			cnt = 0;
			if (i >= 0) {
				maxHigh = a[i];
				post += b[i];
				cnt++;
			}
		}
		return min;
	}

	public static int cntCostpart(int[] b, int start, int end, int before,
			int cnt) {
		int len = cnt + (end - start + 1);
		int leave = end - start + 1;
		if (end <= start || cnt > (int) (len / 2))
			return before;
		int res = 0;

		int[] tmp = Arrays.copyOfRange(b, start, end + 1);
		Arrays.sort(tmp);
		int tmpCnt = 0;
		for (int i = 0; i < tmp.length; i++) {			
			res += tmp[i];
			tmpCnt++;
			if (cnt > (leave - tmpCnt))
				break;
		}
		return res + before;
	}

	public static void main(String args[]) {
		Scanner cin = new Scanner(System.in);
		while (cin.hasNext()) {
			int n = cin.nextInt();
			int[] numl = new int[n];
			int[] numd = new int[n];
			for (int i = 0; i < numl.length; i++)
				numl[i] = cin.nextInt();
			for (int i = 0; i < numd.length; i++)
				numd[i] = cin.nextInt();
			bubbleSort(numl, numd);// sort array
			int cost = countCost(numl, numd);
			System.out.println(cost);

		}
		cin.close();
	}
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM