使数组中小于k的元素相邻的最小交换次数

package main

import (
   "bufio"
   "fmt"
   "math"
   "os"
   "sort"
   "strconv"
   "strings"
)

/*
描述:给出数字k,请输出所有结果小于k的整数组合到一起的最小交换次数。  组合一起是指满足条件的数字相邻,不要求相邻后在数组中的位置。
数据范围 -100 <= k <= 100 -100 <= 数组中的值 <= 100
示例:
第一行输入数据:第二行输入k数值:
1 3 1 4 0
2
输出 1
样例输入2:
第一行输入数据:第二行输入k数值
0 0 1 0
2
输出 0
样例输入3: 第一行输入数据:第二行输入k数值:
2 3 2
1
输出 0
*/
// 数组中小于k的元素的下标组成新数组,遍历该新数组,计算距离组成距离数组,取最小的即为最小交换次数
func main()  {

   input := bufio.NewScanner(os.Stdin)
   input.Scan()
   arrStr := input.Text()
   li := strings.Split(arrStr," ")
   keyArr := make([]int,0) // 数组中小于k的元素的下标组成的数组
   disArr := make([]int,0) // 上述数组中元素的距离值组成的新数组
   input.Scan()
   k,_:= strconv.Atoi(input.Text())
   for i:=0;i<len(li);i++{
      data,_ := strconv.Atoi(li[i])
      if data < k {
         keyArr = append(keyArr,i)
      }
   }
   if len(keyArr) > 1 {
      for i:=0;i<len(keyArr);i++{
         for j:=i+1;j<len(keyArr);j++{ // 二次遍历从下一个元素开始计算
            s := math.Abs(float64(keyArr[i]-keyArr[j] ))-1 //距离计算:想减绝对值 - 1
            disArr = append(disArr,int(s))
         }
      }
   }
   if len(disArr) > 0 {
      sort.Ints(disArr)
   }else{
      fmt.Println(0)
   }
}

 

posted @ 2023-02-23 01:25  $wanggang  阅读(69)  评论(0编辑  收藏  举报