20200728:力扣199周周赛题解(上)

199周周赛题解

题目一:重新排列字符串

给你一个字符串s和一个长度相同的整数数组indices。

请你重新排列字符串s,其中第i个字符需要移动到indices[i]指示的位置。

返回重新排列后的字符串。

长度范围为[1,100]闭区间。s仅包含小写字母。

示例

输入: s = “codeleet”, indices = [4,5,6,7,0,2,1,3]

输出:“leetcode”

解释:索引对应即可。

解题思路

直接模拟即可

代码实现

class Solution {
    public String restoreString(String s,int[] indices) { 
    	char[] ch = s.toCharArray();
        int len = ch.length;
        for (int i = 0; i < len; i++) {
        	ch[inidices[i]] = s.charAt(i);    
        }
    	return String.valueOf(ch);
    }
}

题目二:灯泡开关Ⅴ

房间中有n个灯泡,编号从0到n-1,自左向右排成一行。最开始的时候,所有灯泡都是关闭的。

请你设法使灯泡的开关状态和target描述的一致。

target = [0,1,0]表示灭,亮,灭。

有一个操作可以用于翻转灯泡的状态,翻转操作如下:

  • ​ 选择当前配置下的任意一个灯泡(下标为i)。
  • ​ 翻转下标从i到n-1的每一个灯泡

翻转会让灭的变亮,亮的熄灭。

返回达成target描述的状态需要的最少翻转次数。

示例

输入: target = “10111”

输出:3

解释:初始配置“00000” -> “00111”-> “11000”-> “10111”,共需要3步

解题思路

仔细看题目发现实际上就是求翻转的次数,10111等价于三个部分,101,后续的三个1可以等价为1个1,这样一来我们从最后面开始找这样的一个部分,比如10111,先找到111,变为000,则整个字符串变为10000,此时再把后面的0000变为一块,变为1111,那么整个字符串变为11111,直接再反转一次即可得到起始的00000。如此即可实现。

代码实现

class Solution {
	public int minFlips(String target) {
        char[] ch = target.toCharArray();
        int len = ch.length;
        int res = ch[0] + '0';
        for (int i = 0; i < len - 1; i++) {
            if (ch[i + 1] != ch[i] ) {
                res++;
            }
        }
        return res;
    }
}

你可能感兴趣的:(leetcode学习记录篇)