本文共 1595 字,大约阅读时间需要 5 分钟。
给你一个二进制字符串 binary ,它仅有 0 或者 1 组成。你可以使用下面的操作任意次对它进行修改:
请你返回执行上述操作任意次以后能得到的 最大二进制字符串 。如果二进制字符串 x 对应的十进制数字大于二进制字符串 y 对应的十进制数字,那么我们称二进制字符串 x 大于二进制字符串 y 。
输入:binary = “000110”
输出:“111011” 解释:一个可行的转换为: “000110” -> “000101” “000101” -> “100101” “100101” -> “110101” “110101” -> “110011” “110011” -> “111011”
先上个图:
看图说话,发现一个由 0 和 1 组成的字符串,其中 0 的位置有两种状态,一种是连续的 0 ,一种是由 1 隔开的 , 按照题目的要求将字符串通过两种变化规则使得二进制表示的值最大 。 通过图分析: 1、针对 连续的 0 有,通过操作1,发现 只需要保留连续的最后一个 0 ,其它的位置全部置 1 即可实现二进制值的最大化 ; 2、针对 由 1 隔开的 0 有,通过操作2 ,将 0 和 1 位置的交换,最终 0 会相遇,这时采用一次操作1 ,即可实现二进制最大化; 通过图可发现规律,只需要将 0 所在的位置置 1 , 同时将第一个 0 的下一个位置置 0 即可 ,例如 01110 -> 10111 。 3、通过 1 和 2 , 发现只需要维护一个 数组记录每个 0 在字符串中出现的索引位置 ,然后遍历该数组,按照 1 和 2 的规则进行修改。 class Solution { public String maximumBinaryString(String binary) { char[] chars = binary.toCharArray(); int length = chars.length; int[] z = new int[length]; int j = 0; //记录0的位置 for (int i = 0; i < length; i++) { if (chars[i] == '0') { z[j++] = i; } } for (int i = 0; i < j - 1; i++) { //00->10 if (z[i] + 1 == z[i + 1]) { chars[z[i]] = '1'; } else { // 0111……10可以直接变1011……11 chars[z[i]] = '1'; chars[z[i + 1]] = '1'; z[i + 1] = z[i] + 1; chars[z[i + 1]] = '0';// 0记录变更 } } return new String(chars); }} 转载地址:http://wrjzz.baihongyu.com/