网易笔试——混合颜料

你就是一个画家!你现在想绘制一幅画,但是你现在没有足够颜色的颜料。为了让问题简单,我们用正整数表示不同颜色的颜料。你知道这幅画需要的n种颜色的颜 料,你现在可以去商店购买一些颜料,但是商店不能保证能供应所有颜色的颜料,所以你需要自己混合一些颜料。混合两种不一样的颜色A和颜色B颜料可以产生 (A XOR B)这种颜色的颜料(新产生的颜料也可以用作继续混合产生新的颜色,XOR表示异或操作)。本着勤俭节约的精神,你想购买更少的颜料就满足要求,所以兼职 程序员的你需要编程来计算出最少需要购买几种颜色的颜料?

输入描述:
第一行为绘制这幅画需要的颜色种数n (1 ≤ n ≤ 50)
第二行为n个数x

i

(1 ≤ x

i

 ≤ 1,000,000,000),表示需要的各种颜料.
输出描述:
输出最少需要在商店购买的颜料颜色种数,注意可能购买的颜色不一定会使用在画中,只是为了产生新的颜色。
输入例子:
3
1 7 3
输出例子:
3

解题思路:

由于a^b=c那么a^c=b,a^a=0,最早的思路是将colors[]数组里的元素及其亦或的可能值全部放到一个Map里,然后找到Map里的最小不相交子集(就是里面的任何一个元素不能由其他元素通过^生成)。后来发现空间复杂度都在O(Nn),后来发现一条规律,就是0001,0010,0100,1000,可以通过^生成任意4位的数字,那么本题的答案不会超过32(int的长度),再后来看到高斯消元和最小线性无关组提示之后有了自己的思路。即将数组排序,每次将最高位的1进行^运算,数组里面从后往前数最高位每个1只保留一个,最终得到类似于{0,0,00000001,00000011,00011000,00100010}这样的结构,那么答案就出来了。

Java实现:

package com.tonyluis;

import java.util.*;

public class NeteaseSolution3 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner 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;
	}

	// 插入重排序 ArrayList底层使用数组实现,不如直接使用数组
	// 使用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;
			}
		}
	}
}
				
时间: 2024-12-17 17:11:50

网易笔试——混合颜料的相关文章

网易笔试(小敏)

2017/03/25 小敏姐姐网易笔试助攻 这次网易笔试是4选2分析题+1综合题 笔试时间100分钟 以为绰绰有余 结果因为没有经验 第一道题花了60分钟 妹纸三道题题目分别是: 1.共享单车APP竞争的关键因素是什么?其中最重要的是什么? 未来一年,共享单车APP设计方面会有什么样的发展和变化? 2.假如人们不再需要通过吃饭来提供能量,而是通过闲聊转化为能量,会出现哪些新的需求以及哪些旧的需求会消失? 第二问回忆不起来了 3.针对适龄择偶困难人群,你认为这个群体的用户分为哪些用户群? 这些用户

网易笔试之后的自我反省

网易笔试过后,心里空空的.下来也和同学们交流,可能大家以为我比较水,在我谈到写那个大数类的时候,直接否认了我的分段加法思想.虽然被否认,但是我却不能懈怠,更不能因此沮丧或者自我否定.我应该在质疑声中证明自己.我也可以,而且8月份为了拿到offer,我开始拼了! 首先说一下选择题吧,我的知识面有所扩展,但是mysql.linux方面的知识欠缺的比较多.设计模式我之前看过专栏:设计模式.但是没总结.TCP/IP协议我也是看了vamei大神的总结,整体理解还算行,但是实现细节就比较欠缺了. 说说编程题

混合颜料(类似矩阵求秩)

题目描述 你就是一个画家!你现在想绘制一幅画,但是你现在没有足够颜色的颜料.为了让问题简单,我们用正整数表示不同颜色的颜料.你知道这幅画需要的n种颜色的颜料,你现在可以去商店购买一些颜料,但是商店不能保证能供应所有颜色的颜料,所以你需要自己混合一些颜料.混合两种不一样的颜色A和颜色B颜料可以产生(A XOR B)这种颜色的颜料(新产生的颜料也可以用作继续混合产生新的颜色,XOR表示异或操作).本着勤俭节约的精神,你想购买更少的颜料就满足要求,所以兼职程序员的你需要编程来计算出最少需要购买几种颜色

[编程题]混合颜料

你就是一个画家!你现在想绘制一幅画,但是你现在没有足够颜色的颜料.为了让问题简单,我们用正整数表示不同颜色的颜料.你知道这幅画需要的n种颜色的颜料,你现在可以去商店购买一些颜料,但是商店不能保证能供应所有颜色的颜料,所以你需要自己混合一些颜料.混合两种不一样的颜色A和颜色B颜料可以产生(A XOR B)这种颜色的颜料(新产生的颜料也可以用作继续混合产生新的颜色,XOR表示异或操作).本着勤俭节约的精神,你想购买更少的颜料就满足要求,所以兼职程序员的你需要编程来计算出最少需要购买几种颜色的颜料?

关于网易笔试...

那天得到了内推码,于是试着投了一下简历,然后得到了笔试的机会,于是乎,今晚就参加了笔试,不得不说,不是计算机专业的,根本就好难,然而我是计算机专业的也什么机会都没有T^T 然后在这里说一下自己的不足,接下来要好好加油了. 1.闭包,考了一道闭包的题目,之前一直觉得自己对于闭包其实很熟悉了,可是题目一出来就懵了,看了还是一知半解. 2.forEach问题,题目好像是这样的: var aa = [{a:1},{}] aa.forEach(function(name,value){ name.b =

每天一道算法编程题(1)——网易笔试&quot;工程师工作安排“问题

首先理解题目意思:每个人只能做工作序号表里的一件工作且两个人不能同时做一件工作.AC思路:采用暴力枚举每种可能的分配方案,子问题的解决逐步向上解决了母问题,最终原问题得解. 标程作者:NotDeep(牛客网)链接:https://www.nowcoder.com/discuss/22696?type=6&order=0&pos=5&page=2 1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 vector&

网易笔试

1.小易准备去魔法王国采购魔法神器,购买魔法神器需要使用魔法币,但是小易现在一枚魔法币都没有,但是小易有两台魔法机器可以通过投入x(x可以为0)个魔法币产生更多的魔法币. 魔法机器1:如果投入x个魔法币,魔法机器会将其变为2x+1个魔法币 魔法机器2:如果投入x个魔法币,魔法机器会将其变为2x+2个魔法币 小易采购魔法神器总共需要n个魔法币,所以小易只能通过两台魔法机器产生恰好n个魔法币,小易需要你帮他设计一个投入方案使他最后恰好拥有n个魔法币. 思路:如果n为偶数,则最后一步一定是通过机器2产

网易笔试题目:三列布局,中间自适应宽度,双飞翼布局

<!DOCTYPE html> <html> <head> <title></title> <style type="text/css"> .wrap{ width: 100%; } .one{ float: left; width: 100px; margin-right: -100px; background: yellow; min-height: 100px; } .three{ float: right;

2016网易笔试路灯问题

题目: 一条A点到B点的道路长 l ,现在为该条道路设置 n 个路灯,每个路灯照射的长度固定为 d ,假设这 n 个路灯分别设置在 a1,a2...ai...an ,(路灯可以设置在首尾A点B点处,也可以在同一点设置多个),求使得整条道路保持光明的最小 d. 输入:第一行为道路长度 l 以及路灯总数 n , 第二行为 n 个路灯的位置 a1,a2...ai...an . 输出:d(保留两位小数) 我的解答: import java.text.DecimalFormat;import java.u