无法获得forf循环来迭代我的程序正常工作的时间

时间:2019-05-13 19:01:14

标签: 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) 
}

1 个答案:

答案 0 :(得分:3)

您需要先考虑算法。
而且要删除的数字似乎不是连续的:
在这里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++ {

类似于thisthis

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个循环,例如this
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
}