当我运行以下代码时,我得到预期的答案[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))
}
答案 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++ {
答案 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
。