对于不同的数组输入,twoSum函数的行为不同

时间:2018-03-05 02:45:26

标签: go

当我运行以下代码时,我得到预期的答案[3, 4],这是与我的目标变量相加的2个数字的索引。但是,当我将myArray输入更改为[]int{1,2,3,4,6,11,4,12}(我删除了最后6个)时,我感到恐慌。请帮助我理解为什么会这样。

func twoSum (nums []int, target int) []int {
    length := len(nums) - 1
    for i := range nums[:length] {
        for j := range nums[i + 1:] {
            if nums[i] + nums[j] == target {
                return []int{i, j}
                break
            }
        }
    }
    panic("should never happen")
}

func main() {
    myArray := []int{1,2,3,4,6,11,4,12}
    myTarget := 10
    fmt.Println(twoSum(myArray, myTarget))
}

2 个答案:

答案 0 :(得分:1)

for j := range nums[i + 1:] {

这不会像您期望的那样工作:j此处是新切片的从0开始的索引,是您使用nums重新nums[i+1:]后获得的。

如果您仍希望在nums切片中获得绝对索引,则需要手动抵消它,例如:

jx := j + i + 1

然后使用jx代替j

演示:https://play.golang.org/p/s7_tcHvu6fB

或者,您可能使用了旧的索引for而不是for-range作为嵌套循环:

for j := i + 1; j < length; j++ {

演示:https://play.golang.org/p/-yF7cWYgYri

答案 1 :(得分:0)

# include <stdio.h> void LeastFrequentnum(int arr[],int n); void InsertionSort(int arr[],int n); int main() { int arr[] = {1, 3, 2, 1, 2, 2, 3, 1}; int n = sizeof(arr)/sizeof(arr[0]); LeastFrequentnum(arr,n); } void LeastFrequentnum(int arr[],int n) { InsertionSort(arr,n); int count = 1; int min_count = n+1;// i will update min_count int res=-1; // used to store the element which occurs least number of times for(int i=0;i<n;i++) { count=1; for(int j=i+1;j<n;j++) { if(arr[j]==arr[i]) { count++; } else { i = j+1; if(count<min_count) { min_count = count; res = arr[j]; break; } } } } printf("%d",res); } void InsertionSort(int arr[],int n) { for(int i=1;i<n;i++) { int key = arr[i]; int j = i-1; while(j>=0 && arr[j]>key) { arr[j+1] = arr[j]; j--; } arr[j+1]=key; } } ,您将获得for i := range nums[:length]

的值

0,1,2,3...,您将获得j for j := range nums[i+1:]

的值

然后,当您计算0,1,2,3...的总和时,实际上计算nums[i]+nums[j]nums[0]+nums[0]而不是1+1=2