public class ScalesBalance {
/**
* 题目:
* 给出一个重物重量为X,另外提供的小砝码重量分别为1,3,9。。。3^N。 (假设N无限大,但一种重量的砝码只有一个)
* 将重物放到天平左侧,问在两边如何添加砝码使两边平衡
*
* 分析:
* 三进制
* 我们约定括号表示里面的数是三进制,例如 47=(1202)
* 先看天秤右侧。放的全是砝码,由于一种重量的砝码只有一个,那么右侧的重量之和,用三进制表示的话,只包含0和1
* 要使两边平衡,那么左边的重量和的三进制也应该只包含0和1
* 那么答案就出来了:想办法使得左边的值只包含0和1,那就是把重物里面三进制表示里面的2变成0——对应的位置加1即可
* 将重物的重量转化为三进制,从最低位开始
* 1.遇到0 无操作
* 2.遇到1 右边放
* 3.遇到2 左边放 然后进位
*
* 在实际程序的书写中,
* 1、我们判断一个数三进制的表示里面某一位是0还是1还是2,直接对3求余就可以了;然后右移一位(除以3),再对3求余,则求得更高一位是0还是1还是2
* 2、统计放了什么砝码时,将对应的二制进位置为1,例如 3={11}{二进制},表示放了3^0和3^1这两个砝码;当然用数组存放也可以,只是浪费了空间
* 3、下面代码的balance函数的返回值永远是true,因为任意一个正整数都可以表示为三进制
*/
public static void main(String[] args) {
for (int i = 1; i<= 100; i++) {
boolean ok = balance(i);
if (!ok) {
System.out.println("error!");
}
}
}
/**
* @param weight 重物的重量,应该是一个正整数
* @return 是否可使得天秤平衡
*/
public static boolean balance(int weight) {
if (weight <= 0) {
System.out.println("invalid input.");
return false;
}
int origin = weight; //备份
int left = 0; //左边放了什么砝码
int right = 0; //右边放了什么砝码
int i = 0; //判断第i位是0是1还是2。0是最低位
while (weight != 0) {
int tmp = weight % 3;
if (tmp == 2) {
weight += 1;
left = left | (1 << i); //对应的二进制位置1
} else if (tmp == 1) {
right = right | (1 << i);
}
i++;
weight /= 3;
}
//上面已经求得答案了,现在输出验证一下
StringBuilder sbLeft = new StringBuilder("" + origin);
int sumLeft = origin;
if (left != 0) {
int power = 1;
while (left != 0) {
int value = left & 1;
if (value == 1) {
sbLeft.append(" + " + power);
sumLeft += power;
}
power *= 3;
left = left >> 1;
}
}
int sumRight = 0;
StringBuilder sbRight = new StringBuilder();
if (right != 0) {
int m = 1;
while (right != 0) {
int value = right & 1;
if (value == 1) {
sbRight.append(" + " + m);
sumRight += m;
}
m *= 3;
right = right >> 1;
}
}
System.out.println(sbLeft.toString() + " = " + sbRight.substring((" + ").length()).toString());
System.out.println(sumLeft + "," + sumRight);
return sumLeft == sumRight;
}
}
分享到:
相关推荐
"高校校招笔试真题-web测试题" 这个标题明确指出了这份资料的主题,是针对高等教育机构校园招聘过程中的一份笔试题目,主要涉及的是Web技术领域,特别是前端开发部分。这样的题目集通常是大学毕业生在应聘IT公司,...
点我达作为一家知名的即时物流平台,其2019年校招笔试题对开发者们来说,无疑是一个深入了解企业技术需求、提升自身技能的良好资源。本合集主要针对Java开发者,意味着试题将聚焦于Java编程语言及其相关技术。在准备...
2016年腾讯校招笔试题(主观题2016年腾讯校招笔试题(主观题2016年腾讯校招笔试题(主观题2016年腾讯校招笔试题(主观题2016年腾讯校招笔试题(主观题2016年腾讯校招笔试题(主观题2016年腾讯校招笔试题(主观题2016...
2015年9月虹软校招内推笔试题-算法工程师岗位
【标题】"2015-9-虹软校招内推笔试题-算法岗" 涉及的是一场2015年9月份美国虹软公司(Arcsoft)针对算法工程师岗位的校园招聘内部推荐笔试。这个题目集对于准备参加类似招聘活动的应聘者具有很高的参考价值。虹软...
移动笔试真题之技术类--2012年中国移动笔试试题(网维)完整版.doc 移动笔试真题之技术类--中国移动技术类招聘资质试题.pdf 移动笔试真题之技术类--浙江移动金华分公司无线网优测试试题.pdf 移动笔试真题之综合类--...
【标题】"网易校招面试笔试题"涵盖了网易公司在招聘过程中对候选人的技术与非技术能力的考察。作为中国互联网巨头之一,网易对于应聘者的选拔非常严谨,面试笔试环节是评估候选人是否具备所需技能和潜力的重要阶段。...
2015秋季校招-广电笔试题. 手机拍的
"阿里校招软件笔试题解析" 在这篇文章中,我们将对阿里校招软件笔试题进行详细的解析和分析,并对每道题目进行逐一的知识点总结。 1. 二叉树最大差值 在第一个问题中,需要编写一个函数,输入一个二叉树,树中每...
美团作为一家知名的互联网公司,其校招笔试题往往涉及到算法、数据结构以及概率统计等多个方面。以下将详细解析这些题目所涉及的知识点: 1. **通过中序遍历和后序遍历求前序遍历** 这是一道关于二叉树遍历的问题...
阿里巴巴2014校招笔试题--测试开发(与研发题目相似)
【标题】"校招笔试题经典汇总"是一个包含多种编程语言面试及笔试题目的资源集合,主要针对应届毕业生在校园招聘中的技术考核。这个压缩包文件涵盖了C/C++和Java两大编程语言的相关试题,旨在帮助求职者提升在面试和...
【标题】"校招笔试题2014"揭示了这个资料包的主旨,它主要包含的是2014年企业校园招聘时的笔试题目。这些试题通常涵盖多个IT技术领域,旨在测试应聘者的编程能力、逻辑思维、基础知识以及问题解决技巧。对于在校学生...
阿里巴巴校招前端笔试题 校招前端笔试题.pages
阿里巴巴2013年9月份上海站研发笔试题,扫描版~
校招Java笔试题集锦是为即将参加校园招聘的求职者准备的一份宝贵资源,旨在帮助他们提升技能,顺利通过面试。这份题集包含了各种类型的Java题目,涵盖了基础语法、面向对象编程、集合框架、多线程、异常处理、JVM...
【中兴2014校招软件笔试题】是一份针对中兴通讯公司在2014年校园招聘中使用的软件工程师笔试题目集。这个题目集反映了当年中兴对软件开发人员的技术要求和考察重点,旨在筛选出具备扎实编程基础、良好问题解决能力和...
宇视科技2016年校招笔试题,刚结束就整理出来了,求攒人品。
创新工场校招研发笔试题.pdf 小米校招技术类笔试题.pdf 届阿里巴巴校招测试开发工程师在线笔试题.pdf 年欢聚时代校园招聘C++笔试题目.pdf 年欢聚时代(YY)校园招聘Java笔试题目.pdf 网易校招JAVA开发工程师.pdf ...