无法让 for 循环迭代足够的次数让我的程序工作

  • 本文关键字:程序 工作 for 循环 迭代 go
  • 更新时间 :
  • 英文 :


我正在尝试做一些练习,我们的教授给我们准备考试,但我陷入了一个非常烦人的问题。
该练习需要两个输入N和D,并且该程序必须找到最小的数字从数字n中删除D小数。问题在于第40或41行,因为我不知道如何获得足够的循环来尝试每一个。目前,该程序是有限的,并且无法与大多数输入合作。

示例输入: 32751960 3
预期输出: 21960(这是我们可以从第一个数字中删除3个小数的最小数字(
我得到的: 31960

事先感谢任何愿意帮助我的人。

代码:

package main
import (
    "fmt"
    "os"
    "bufio"
    "strconv"
    "strings"
    "math"
)
var (
    input string
    n, d, max int
    num, dec string
    in []int
)
func main (){
    getInput()
    max = n
    fmt.Println("Variables: ", n, d)
    //Check
    if d>len(num){
        fmt.Println(math.NaN())
        os.Exit(0)
    }
    //The problematic cicle
    for i:=d; i<=len(num); i++{ //On line 40 or 41 lies the problem: I don't get enough loops to check every possible combination,
                                //and at the same time i have to limit the i var to not exceed the slice boundaries
        temp := num[:i-d] + num[i:] 
        if temp == ""{ //To avoid blank strings
            continue
        }
        itemp, _ := strconv.Atoi(temp)
        fmt.Println(itemp)
        if itemp < max {
            max = itemp
        }
    }
    fmt.Println("Best number:",max)
}
func getInput(){
    scanner := bufio.NewScanner(os.Stdin)
    if scanner.Scan(){
        input = scanner.Text()
    }
    for _, s := range strings.Fields(input){
        i, err := strconv.Atoi(s)
        if err != nil {
            fmt.Println(err)
        }
        in = append(in, i) //
    }
    n = in[0] //main number
    d = in[1] //decimals to remove
    num = strconv.Itoa(n)
    dec = strconv.Itoa(d) 
}

您需要先考虑一下算法。
并且要删除的数字似乎不连续:
在这里temp := num[:i-d] + num[i:]您正在尝试删除3个相邻数字(对于d=3(,并且您应该尝试删除不相邻的数字。
提示:
一次删除一个数字(k(:n = n[:k] + n[k+1:]


  1. 首先出于学习目的,我建议您尝试蛮力方法:生成所有可能的状态,并在其中找到最小的数字。

  1. 对于最小数字的左数小于右侧数字。
    删除d不连续数字,然后找到最小的数字。我建议d数字一个循环:
    for i := 0; i < d; i++ {
    以及查找k位置删除的另一个循环:
    for j := 0; j < k; j++ {

喜欢这样:

package main
import "fmt"
func main() {
    n := "32751960"
    d := 3
    // fmt.Scan(&n, &d)
    for i := 0; i < d; i++ {
        k := len(n) - 1
        for j := 0; j < k; j++ {
            if n[j] > n[j+1] {
                k = j
                break
            }
        }
        n = n[:k] + n[k+1:]
    }
    fmt.Println(n) // 21960
}

  1. 使用1个循环,这样:
package main
import "fmt"
func main() {
    n := "322311"
    d := 3
    // fmt.Scan(&n, &d)
    for j := 0; j < len(n)-1; j++ {
        if n[j] > n[j+1] {
            n = n[:j] + n[j+1:]
            j = -1
            d--
            if d <= 0 {
                break
            }
        }
    }
    n = n[:len(n)-d]
    fmt.Println(n) // 211
}

相关内容

最新更新