题意:

方法1(枚举法)

思路:

  • 先找到所有小于1000000的3的幂的数:[1, 3, 9, 27, 81, 243, 729, 2187, 6561, 19683, 59049, 177147, 531441]
  • 根据题意可知每一个数的前面的系数只有三种可能性[-1, 0, 1]
  • 那么有inputNum = (系数)*1 + (系数)*3 + (系数)*9 + (系数)*27 + (系数)*81 + (系数)*243 + (系数)*729 + (系数)*2187 + (系数)*6561 + (系数)*19683 + (系数)*59049 + (系数)*177147 + (系数)*531441
  • 使用14层循环(手有点酸)遍历[-1, 0, 1],表示上面14个系数,再根据上面的匹配条件来筛选出每一个数的系数
    private static String fn(int inputNum) {StringBuilder builder = new StringBuilder();int[] arr = {-1, 0, 1};for (int a : arr)for (int b : arr)for (int c : arr)for (int d : arr)for (int e : arr)for (int f : arr)for (int g : arr)for (int h : arr)for (int i : arr)for (int j : arr)for (int k : arr)for (int l : arr)for (int m : arr)for (int n : arr) {int o = 1 * a;int p = 3 * b;int q = 9 * c;int r = 27 * d;int s = 81 * e;int t = 243 * f;int u = 729 * g;int v = 2187 * h;int w = 6561 * i;int x = 19683 * j;int y = 59049 * k;int z = 177147 * l;int z1 = 531441 * m;int z2 = 1594323 * n;// 如果相加后与输入值匹配,则将相应的非0数添加到builder中// 如果数大于0则在其前面加上"+"if (o + p + q + r + s + t + u + v + w + x + y + z + z1 + z2 == inputNum) {builder.append(z2 != 0 ? (z2 > 0 ? "+" + z2 : "" + z2) : "");builder.append(z1 != 0 ? (z1 > 0 ? "+" + z1 : "" + z1) : "");builder.append(z != 0 ? (z > 0 ? "+" + z : "" + z) : "");builder.append(y != 0 ? (y > 0 ? "+" + y : "" + y) : "");builder.append(x != 0 ? (x > 0 ? "+" + x : "" + x) : "");builder.append(w != 0 ? (w > 0 ? "+" + w : "" + w) : "");builder.append(v != 0 ? (v > 0 ? "+" + v : "" + v) : "");builder.append(u != 0 ? (u > 0 ? "+" + u : "" + u) : "");builder.append(t != 0 ? (t > 0 ? "+" + t : "" + t) : "");builder.append(s != 0 ? (s > 0 ? "+" + s : "" + s) : "");builder.append(r != 0 ? (r > 0 ? "+" + r : "" + r) : "");builder.append(q != 0 ? (q > 0 ? "+" + q : "" + q) : "");builder.append(p != 0 ? (p > 0 ? "+" + p : "" + p) : "");builder.append(o != 0 ? (o > 0 ? "+" + o : "" + o) : "");}}// 删去第一个"+"builder.deleteCharAt(0);return builder.toString();}public static void main(String[] args) {System.out.println(fn(50000));// 打印: 59049-6561-2187-243-81+27-3-1}
方法2(变种三进制)
  1. 引导问题:把砝码重量改为2的指数幂(1,2,4,8,16…)

    使用二进制来解决该问题:

    1. 把inputNum转为二进制,例如称量重量为11的物体,11的二进制为1011
    2. 二进制的每一位数可以表示两种状态:1—> 取对应位的2次幂,0—> 不取对应位的2次幂
    3. 把1011(二进制)转为十进制:8*1 + 4*0 + 2*1 + 1*1,即11 = 8 + 2 + 1,而8,2,1恰好就是砝码的重量
  2. 类比上面的方法,使用三进制来解决该问题

    1. 把inputNum转为三进制,例如称量重量为11的物体,11的三进制为102
    2. 如果类比上面二进制的方法:11 = 9*1 + 3*0 + 2*1,取一次9,取2次1,不符合题意,因为要求每种重量的砝码只能取一次
    3. 改变一下规则:让三进制数逢2进1,原位数自减1,例如102(三进制)—> 1 1 -1—> 11 = 9*1 + 3*1 + 1*(-1)—> 取一次9取一次3放在右盘,取一次1放在左盘

    使用该方法前建议做一下这道题:LeetCode 415. 字符串相加
    下面的代码是类比逢10进1,改为的逢2进1,并且都是对字符内容运算的处理

        // 让三进制数逢2进1,原位数自减1,例如102(三进制)---> 1  1  -1---> 11 = 9*1 + 3*1 + 1*(-1)// 220121 ---> -1 3 0 1 2 1 ---> -1 0 1 1 2 1 ---> -1 0 1 1 -1 2 ---> -1 0 1 1 -1 -1 1//      -1 0 1 1 -1 -1 1//       0 1 2 3  4  5 6//       1 3 9 27 ...public static String fn2(int inputNum) {// 转为三进制String x = Integer.toString(inputNum, 3);// 翻转转为字符数组char[] c = new StringBuilder(x).reverse().toString().toCharArray();int add = 0;ArrayList<Integer> list = new ArrayList<>();int i = 0;while (i < c.length || add != 0) {// 三进制的每一位数字int y = i < c.length ? c[i] - '0' : 0;// 因为有逢2进1的处理,所以会有进位int num = y + add;// 对每一位大于等于2的数进行余2减1后添加到集合中(保证最终放到集合中的元素是[-1,0,1])list.add(num >= 2 ? num % 2 - 1 : num);// 大于2的数进位1add = num / 2;i++;}// 上面循环结束后就得到了一个三进制转十进制每一位数对应的系数的列表StringBuilder builder = new StringBuilder();// 倒序遍历列表,将相应系数乘上对应位数添加到StringBuilder中for (int j = list.size() - 1; j >= 0; j--) {int number = (int) (list.get(j) * Math.pow(3, j));builder.append(number != 0 ? (number > 0 ? "+" + number : number + "") : "");}return builder.deleteCharAt(0).toString();}
    
收获
  • 用枚举法解决问题的核心思想:

    1. 找到题目中隐藏的恒等条件(题目也可能直接给出),比如本题中的隐藏的恒等条件就是:inputNum = (系数)*1 + (系数)*3 + (系数)*9 + (系数)*27 + (系数)*81 + (系数)*243 + (系数)*729 + (系数)*2187 + (系数)*6561 + (系数)*19683 + (系数)*59049 + (系数)*177147 + (系数)*531441 + (系数)*1594323,系数取值为[-1, 0, 1]
    2. 嵌套遍历循环隐藏恒等条件中不定的量(这些不定量也可能有一些取值条件,比如说互不相等,那么在每层循环中还需添加相应的条件再进行下一层循环),本题中隐藏恒等条件中的不定量就是系数,系数的取值条件是[-1, 0, 1]
    3. 在最后一层循环中通过题目的问题建立筛选条件
  • 三目运算符嵌套三目运算符的使用:条件1 ? (条件2 ? A : B) : C

    不满足条件1则执行C
    满足条件1不满足条件2则执行B
    满足条件1又满足条件2则执行A

  • StringBuilder中有两个用来删去其中字符串内容的方法

    1. delete(int start, int end),区间左闭右开同substring(),返回修改后的StringBuilder
    2. deleteCharAt(int index) ,返回修改后的StringBuilder
  • 将一个十进制数转为radix进制数的方法:Integer.toString(int i, int radix);

天枰称重 (枚举法|进制转换逢十进一模版)相关推荐

  1. 数据的表示和运算,进制转换,BCD码,奇偶校验码,海明校验码,循环冗余码

    进制转换,逢r进一 基数:每个数码位所用到的不同符号的个数,r进制的基数为r 二进制 0 1 B 八进制 0~7 O 十进制 0~ 9 D 十六进制 0~9 ,A ~F( 10 ~15) H或0x 二 ...

  2. 枚举 + 进制转换 --- hdu 4937 Lucky Number

    Lucky Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) T ...

  3. C语言 枚举,进制,原码,反码,补码,移码,结构体

    该博文为原创文章,未经博主同意不得转载,如同意转载请注明博文出处 本文章博客地址:https://cplusplus.blog.csdn.net/article/details/104294089 枚 ...

  4. 51Nod_1925 进制转换【进制+枚举】

                                            51Nod_1925 进制转换 http://www.51nod.com/Challenge/Problem.html# ...

  5. [E进位制] lc168. Excel表列名称(进位制+进制转换)

    文章目录 1. 题目来源 2. 题目解析 1. 题目来源 链接:168. Excel表列名称 相关:[E进位制] lc171. Excel表列序号(进位制+进制转换) 互为逆运算,但本题更加难一些. ...

  6. c语言2进制16进制 表格,标题:整数进制转换(十六进制,十进制,二进制)--表格法...

    标题:整数进制转换(十六进制,十进制,二进制)--表格法 在计算机里,最基本的存储单位为字节(Byte,常说的大B),1个字节包含8位(bit,常说的小b).计算机的数据就是一个字节一个字节的形式存储 ...

  7. 任意进制转换成十进制间互化(ASCII码法)(C/C++)

    目录 1 最早的版本(C) 2  针对上面的问题进行改进(C++) 2.1  任意进制转换成十进制(运用字符串) 2.2  十进制转换成任意进制(运用数组逆序存储+取模作除法) 3  ASCII码参考 ...

  8. 基础知识(一),ip地址详解、网关、DNS、进制转换、DOS命令、批处理、用户和组管理、telnet、RDP、NTFS、CIFS

    基础知识: 企业 >enterprise 专业 >profession 服务器 >server 客户端 >client 浏览器 >Browser B/S 架构:服务器对应 ...

  9. JAVA基础——关键字与保留字——标识符——进制转换

    本节学习目录 前言 一.JAVA的关键字和保留字 1.什么是Java关键字? 2.什么是Java保留字? 二.JAVA标识符及命名规则 1.标识符 2.命名规则 三.进制的转换 1.何为进制? (1) ...

最新文章

  1. 对xxl-job进行simpleTrigger并动态创建任务扩展
  2. DeviceToken 获取失败,原因:Error Domain=NSCocoaErrorDomain Code=3000 未找到应用程序的“aps-environment”的授权字符串......
  3. C#--封装、继承、多态
  4. python动态生成html报表_Python应用phy模块生成html表格
  5. C#中的ForEach
  6. 2020蓝桥杯省赛---java---B---2(寻找 2020)+测试txt
  7. 人工智能-机器学习之Selenium(chrome驱动,火狐驱动)
  8. mysql 标记_Mysql操作基础,标记一上
  9. docker修改php.ini,docker部署更改php的upload_max_filesize
  10. 【转载】Maven pom文件详解
  11. java session重复登录_Java开发网 - Hibernate:session中对象重复问题的解决方法(原创)...
  12. 1万字说清楚Receiver Operating curve(ROC) 受试者操作特征曲线
  13. 清理autodesk产品注册表_AUTODESK 卸载工具,完美彻底卸载清除干净autodesk各种软件残留注册表和文件...
  14. SaaS服务和个性化需求,就不能鱼和熊掌兼得吗?
  15. linux录制声卡声音_Linux ALSA 多声卡操作
  16. 微信小程序 弹出确定取消框
  17. 银河麒麟V10(Kylin Linux V10)安装 Kibana-7.15.2
  18. java 获取当前是周几_java 获取今天(某一天)是星期几/周几
  19. 计算机理论和地理的关系,计算机辅助地理教学的理论和实践
  20. navigation_plugin

热门文章

  1. python 学习DAY12
  2. java程序猿总结出来的经验
  3. 关于在Android中访问和使用到上下文变量
  4. 《菜菜的机器学习sklearn课堂》降维算法PCA和SVD
  5. 网络协议从入门到底层原理(8)HTTPS(成本、通信过程、TLS1.2的连接,配置服务器HTTPS)
  6. 【南邮操作系统实验】页面置换算法(FIFO、LRU、OPT) Python 版
  7. Linux 搜索 查找find命令 详解
  8. [转]nginx常见配置详解
  9. vue3 src/main.js文件配置
  10. python functools模块方法