题意

给出一个长度为n的字符串,请构造一个数组,具体要求如下:

  • 当这一位是1时,要求 a[i]=i
  • 当这一位是0是,要求 a[i]!=i

尽可能多的满足要求

思路

先把所有字符串里是0的位置填上a[i]=i,并且记录下字符串里1的位置的数值tmp。

再填字符串里是1的位置的时候,可以考虑每一个元素都等于tmp数组的下一个元素,这样可以尽量满足a[i] != i

Go代码

package main

import "fmt"

func main() {
	var n int
	var s string
	fmt.Scan(&n, &s)
	//第i个表示第i个小朋友的位置 1表示独特 不相等;0表示不独特,相等
	a := make([]int, n)
	tmp := make([]int, 0, n)
	for i := 0; i < n; i++ {
		if s[i] == '0' {
			a[i] = i + 1
		} else {
			tmp = append(tmp, i+1)
		}
	}
	idx := 0
	for i := 0; i < n; i++ {
		if s[i] == '1' {
			if idx+1 < len(tmp) {
				a[i] = tmp[idx+1]
			} else {
                idx = 0
				a[i] = tmp[idx]
			}
            idx++
		}
	}
	for i := 0; i < n; i++ {
		fmt.Printf("%d ", a[i])
	}
}