日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

网易笔试——混合颜料

發(fā)布時間:2025/7/14 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 网易笔试——混合颜料 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

你就是一個畫家!你現(xiàn)在想繪制一幅畫,但是你現(xiàn)在沒有足夠顏色的顏料。為了讓問題簡單,我們用正整數(shù)表示不同顏色的顏料。你知道這幅畫需要的n種顏色的顏 料,你現(xiàn)在可以去商店購買一些顏料,但是商店不能保證能供應所有顏色的顏料,所以你需要自己混合一些顏料。混合兩種不一樣的顏色A和顏色B顏料可以產(chǎn)生 (A XOR B)這種顏色的顏料(新產(chǎn)生的顏料也可以用作繼續(xù)混合產(chǎn)生新的顏色,XOR表示異或操作)。本著勤儉節(jié)約的精神,你想購買更少的顏料就滿足要求,所以兼職 程序員的你需要編程來計算出最少需要購買幾種顏色的顏料?

輸入描述:
第一行為繪制這幅畫需要的顏色種數(shù)n (1 ≤ n ≤ 50) 第二行為n個數(shù)x

i

(1 ≤ x

i

≤ 1,000,000,000),表示需要的各種顏料.
輸出描述:
輸出最少需要在商店購買的顏料顏色種數(shù),注意可能購買的顏色不一定會使用在畫中,只是為了產(chǎn)生新的顏色。
輸入例子:
3 1 7 3
輸出例子:
3

解題思路:

由于a^b=c那么a^c=b,a^a=0,最早的思路是將colors[]數(shù)組里的元素及其^的所有可能值全部放到一個Map里,然后找到Map里的最小不相交子集(就是里面的任何一個元素不能由其他元素通過^生成),但是后來發(fā)現(xiàn)空間復雜度都在O(Nn)。

后來發(fā)現(xiàn)一條規(guī)律,就是0001,0010,0100,1000,可以通過^生成任意4位的數(shù)字,那么本題的答案不會超過32(int的長度)

再后來想到高斯消元和最小線性無關組就有了自己的思路。首先將數(shù)組排序,獲取最高位的1,每次將最高位的1進行^運算,使得數(shù)組里面從后往前數(shù)最高位每個1只保留一個,最終得到類似于{0,0,00000001,00000011,00011000,00100010}這樣的結構,那么答案就出來了。

Java實現(xiàn):

package com.tonyluis;import java.util.*;public class NeteaseSolution3 {public static void main(String[] args) {// TODO Auto-generated method stubScanner in = new Scanner(System.in);while (in.hasNext()) {final int SUM = in.nextInt();int[] colors = new int[SUM];for (int i = 0; i < SUM; i++)colors[i] = in.nextInt();Arrays.sort(colors);System.out.println(minColor(colors));}}static int minColor(int[] colors) {int max = 1 << 30;int right = colors.length - 1;while (right >= 0 && colors[right] != 0) {while (max > colors[right])max >>= 1;while (right > 0 && colors[right - 1] >= max) {colors[right - 1] ^= colors[right];insertSort(colors, right - 1);}right--;}return right >= 0 ? colors.length - right - 1 : colors.length;}// 將一個數(shù)插入到有序數(shù)組中 ArrayList底層使用數(shù)組實現(xiàn),不如直接使用數(shù)組// 使用LinkedList可以減少直接插入排序的移位操作static void insertSort(int[] nums, int index) {int temp = nums[index];if (temp <= nums[0]) {for (int i = index; i > 0; i--)nums[i] = nums[i - 1];nums[0] = temp;return;}for (int i = index - 1; i >= 0; i--) {if (temp > nums[i]) {for (int j = index; j > i + 1; j--)nums[j] = nums[j - 1];nums[i + 1] = temp;return;}}} }

?

?



轉(zhuǎn)載于:https://www.cnblogs.com/tonyluis/p/5774700.html

總結

以上是生活随笔為你收集整理的网易笔试——混合颜料的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。