首页 > 试题广场 >

设计一个函数1

[编程题]设计一个函数1
  • 热度指数:3082 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
设计一个函数,两个参数,第一个参数为整数的数组,第二个参数为标杆值,取数组中任意符合两个数相加为标杆值的下标相加到一起的值
传入一串字符串(如下例子所示),转义为数组,除去数组中最后一位数字作为标杆值,取数组中任意符合两个数相加为标杆值的下标,输出所有符合要求的下标的和。
如下解释:
value:0,1,5,11,17,16,2,5,10,30,12
index:1 3  6  8
输出结果为18

输入描述:
一串数字,逗号分割,最后一个值为标杆值
数组长度不超过1000,所有数均为不超过1e9的正整数。


输出描述:
结果值
示例1

输入

0,1,5,11,17,16,2,5,10,30,12

输出

18
示例2

输入

1,1,1,2

输出

6

说明

(0+1)+(0+2)+(1+2)=6
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

const char* const DELIM = ",";

// function prototype
int foo_bar(int* nums, const int numsSize, const int k);

int main(const int argc, const char* argv[]) {
  
  char input[10240] = "";
  fgets(input, 10240, stdin);
  
  int nums[1024], numsSize = 0, k;
  char* tok = strtok(input, DELIM);
  while (tok) {
    *(nums + numsSize++) = atoi(tok);
    tok = strtok(NULL, DELIM);
  }
  
  k = *(nums + --numsSize); // k == goal == target(阈值)
  return fprintf(stdout, "%d", foo_bar(nums, numsSize, k)), 0;
}

int foo_bar(int* nums, const int numsSize, const int k) {
  int i, j, s = 0;
  for (i = 0; i < numsSize; ++i)
    for (j = i + 1; j < numsSize; ++j)
      if (*(nums + i) + *(nums + j) == k)
        s += i + j;
  
  return s;
}

发表于 2021-07-16 12:42:53 回复(0)
function sumIndex(strArr){
    if(typeof strArr !== 'string') return 0
    let arr = strArr.split(',')
    arr.forEach((e,i)=>{arr[i] = parseInt(e)})
    let count = arr.pop()
    let sumIndex = 0
    for(let i=0;i<arr.length;i++){
        const x = arr[i];
        for (let j = i+1; j < arr.length; j++) {
            const y = arr[j];
            if(x+y===count) sumIndex+=(i+j)
        }
    }
    return sumIndex
}

发表于 2021-04-20 14:14:37 回复(0)
直接双重循环,用O(n^2)的复杂度暴力求解
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] params = br.readLine().trim().split(",");
        int[] arr = new int[params.length - 1];
        for(int i = 0; i < params.length - 1; i++)
            arr[i] = Integer.parseInt(params[i]);
        int benchMark = Integer.parseInt(params[params.length - 1]);
        System.out.println(solve(arr, benchMark));
    }
    
    private static int solve(int[] arr, int benchMark) {
        int result = 0;
        for(int i = 0; i < arr.length - 1; i++){
            for(int j = i + 1; j < arr.length; j++)
                if(arr[i] + arr[j] == benchMark) result += i + j;
        }
        return result;
    }
}


发表于 2021-02-27 14:40:07 回复(0)
//先排好序
//然后从俩端开始扫描

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

void read(vector<pair<int,int>> &m,int &k)
{
    char ch;
    int num=0;
    int i=0;
    while((ch=getchar())!='\n')
    {
        if(ch==',')
        {
            m.push_back(pair<int,int>(i,num));
            num=0;
            i++;
        }
        else
            num=num*10+(ch-'0');
    }
    k=num;
}

bool compare(const pair<int,int> &a,const pair<int,int> &b)
{
    return a.second<b.second;
}

int main()
{
    vector<pair<int,int>> v;
    int flag;
    read(v,flag);
    sort(v.begin(),v.end(),compare);
    int sum=0;
    auto i=v.begin();
    auto j=v.end()-1;
    while(i<j)
    {
        if((i->second+j->second)>flag)
            j--;
        else if((i->second+j->second)<flag)
            i++;
        else
        {
            auto m=j;
            while(m>i)
            {
                if((i->second+m->second)==flag)
                {
                    sum+=m->first+i->first;
                    m--;
                }
                else
                    break;
            }
            i++;
        }
    }
    cout<<sum;
}

编辑于 2020-03-14 10:53:20 回复(0)
#include <bits/stdc++.h>
using namespace std;
int solve(multimap <int,int> &marr,int flag){
    int sum=0;
    multimap<int,int>::iterator it=marr.begin();
    while(it!=marr.end()){
        multimap<int,int>::iterator temp=marr.find(flag- it->first);
        if(it==temp)
            temp++;
        
        if(temp==marr.end()){
            it++;
            continue;
        }
        
        while(it->first+temp->first==flag){
            sum+=it->second + temp->second;
            temp++;
        }
        it=marr.erase(it);
    }
    return sum;
}
int main(){
    multimap <int,int> marr;
    int index=0,flag;
    while(1){
        int t;
        cin>>t;
        if(cin.get()!='\n')
            marr.insert(make_pair(t,index));
        else{
            flag=t;
            break;
        }
        index++;
    }
    cout<<solve(marr,flag);
    return 0;
}

编辑于 2019-10-20 10:02:41 回复(0)
#include <iostream>
#include <map>
using namespace std;
int main(void){
    map<int, pair<int, int>> m;
    int x, i = 0, ans = 0;
    while(cin>>x){
        if(cin.get() == '\n')
            break;
        if(m.count(x))
            m[x].first += i, m[x].second += 1;
        else
            m.insert({x, {i, 1}});
        ++i;
    }
    for(auto element : m){
        if(element.first > x/2)
            break;
        else if(element.first*2 == x && element.second.second > 1)
            ans += element.second.first * (element.second.second - 1);
        else if(m.count(x - element.first))
            ans += element.second.first * m[x-element.first].second + 
            m[x-element.first].first * element.second.second;
    }
    cout<<ans<<endl;
    return 0;
}
使用map存储,关键字为数组元素,对应的值为[当前元素出现下标总和,当前元素出现次数]
设x,y为满足x+y=sum标杆值的一队数组元素:
1. 当x*2=y*2=sum时,需要判断x出现的次数,出现次数times≤1,组不了一对,出现个数m>1,比如给出例子中的1,1,1,2,由于1刚好时2的一半并且出现了3次,times=3,下标总和为0+1+2=3,在三个下标值中任取两个相加,最后总和为(0+1)+(0+2)+(1+2)=6,不然发现每个下标值在计算总和中出现了times-1次,所以总和计算公式为(times-1)×下标之和
2.当x≠y但x+y=sum时,此时总和计算公式=x下标之和*y出现的次数+y下标之和*x出现的次数
发表于 2019-08-21 10:11:24 回复(0)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;

public class Main{

    /**
     * 方法一:借助hashMap保存值和索引值
     */
    public static void main(String[] args) throws IOException {

        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        String[] strs = bf.readLine().split(",");
        int len = strs.length;
        int target = Integer.parseInt(strs[len - 1]);//目标值
        HashMap<Integer, ArrayList<Integer>> map = new HashMap<>();
        int ans = 0;
        for (int i = 0; i < len - 1; i++) {
            int a = Integer.parseInt(strs[i]);
            if (map.containsKey(target - a)) {
                ArrayList<Integer> list = map.get(target - a);
                for (int j = 0; j < list.size(); j++) {
                    ans += list.get(j);
                    ans += i;
                }
            }
            if (map.containsKey(a)) {
                map.get(a).add(i);
            } else {
                map.put(a, new ArrayList<>());
                map.get(a).add(i);
            }
        }
        System.out.println(ans);
    }
}

/**
 * 方法二:暴力枚举
 */

public class Main {
    public static void main(String args[]) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] str = br.readLine().split(",");
        int value = Integer.parseInt(str[str.length - 1]);   //标杆值
        int[] arr = new int[str.length - 1];
        for (int i = 0; i < arr.length; i++)     //数组
            arr[i] = Integer.parseInt(str[i]);
        int sum = 0;    //和
        for (int i = 0; i < arr.length - 1; i++) {
            for (int j = i + 1; j < arr.length; j++) {
                if (arr[i] + arr[j] == value)
                    sum = sum + i + j;
            }
        }
        System.out.println(sum);
    }
}

发表于 2019-07-31 10:24:54 回复(0)
#include <bits/stdc++.h>
using namespace std;

int main(){
    string s;
    cin>>s;
    istringstream ss(s);
    int x, sum=0;
    char c;
    vector<int> v;
    while(ss>>x){
        v.push_back(x);
        ss>>c;
    }
    int n = v.size();
    int t = v[n-1];
    for(int i=0;i<n-1;i++)
        for(int j=i+1;j<n-1;j++)
            if(v[i]+v[j]==t)
                sum += i+j;
    cout<<sum<<endl;
    return 0;
}

发表于 2019-07-28 09:26:12 回复(0)
""""
数组遍历
"""

if __name__ == "__main__":
    a = list(map(int, input().strip().split(',')))
    n = a.pop()
    ans = 0
    for i in range(len(a)):
        for j in range(i + 1, len(a)):
            if a[i] + a[j] == n:
                ans += i + j
    print(ans)

发表于 2019-07-14 18:56:01 回复(0)
#include <bits/stdc++.h>
using namespace std;
int main()
{
    vector<int> a;
    string s;
    cin >> s;
    int cur=0, sign = 1;
    for (int i = 0; i < s.length(); i++)
    {
        if (!isdigit(s[i]))
        {
            a.push_back(cur * sign);
            cur = 0;
            sign = 1;
        }
        else
            cur = cur * 10 + s[i] - '0';
    }
    long long n=cur * sign,sum=0;
    for(int i=0;i<a.size();i++)
    {
        for(int j=i+1;j<a.size();j++)
            if(a[i]+a[j]==n)
                sum=sum+i+j;
    }
    cout<<sum<<endl;
    return 0;
}

发表于 2019-07-04 19:43:31 回复(0)
while(line=readline()){
    var b = line.split(',');
var a=[];
b.forEach(element => {
  a.push(parseInt(element));
});
var t=a.length-1;
var sum;
var result=0;
for(let i=0;i<t;i++){
  for(let j=i+1;j<t;j++){
    if((a[i]+a[j])==a[t]){
      sum=i+j;
      result = result+sum;
    }
  }
}
console.log(result);
     
}
发表于 2019-09-05 20:43:24 回复(0)
let inputvalue = readline().split(',')
function sum(arr){
    let arr1 = arr.map(t=>parseInt(t))
    let value = arr1.pop()
    let newarr = []
    for(let i = 0;i<arr1.length;i++){
        let diff = value - arr1[i]
        arr1.splice(i,1,"a")
        arr1.forEach((t,index) =>{
            if( t === diff){
                newarr.push(i)
                newarr.push(index)
            }
        })
    }
   let sum = eval(newarr.join("+"))
  
    return sum || 0
}
print(sum(inputvalue))

编辑于 2021-06-30 21:58:08 回复(0)
大佬们,我这代码有啥问题吗,只能通过20%
    var line = readline()
    var lines = line.split(',')
    var arr = lines.slice(0, lines.length-1)
    var n = lines[lines.length - 1]
    function getSum(arr, n){
    var result = []
    for(var i = 0; i < arr.length - 1; i++){
        var index = i
        for(var j = i + 1; j < arr.length; j++){
            if(arr[index] + arr[j] === n){
                result.push(index, j)
            }
        }
    }
    var sum = 0
    for (const item of result) {
        sum += item
    }
    return sum
    }
    print(getSum(arr, n))


发表于 2020-09-15 15:32:06 回复(0)
谁能告诉我这份代码是哪里出了问题吗?一直不能通过😂
function getData(s){
				var a=s.split(",");
				var index=parseInt(a[a.length-1]);
				var result=0;
				for(let i=0;i<a.length-1;i++){
					if(parseInt(a[i])>index)continue;
					for(let j=i+1;j<a.length-1;j++){
						if(parseInt(a[i])+parseInt(a[j]) == index){
							result=result+i+j;
						}
					}
				}
				return result;
			}


发表于 2020-08-20 16:35:27 回复(0)
#include<bits/stdc++.h>
using namespace std;
int main() {
	string s; cin >> s;
	vector<string>vs;
	for (int i = 0; i<s.length();) {
		string str = "";
		while (s[i] != ','&&i<s.length()) {
			str += s[i];
			i++;
		}
		vs.push_back(str);
		i++;
	}
	stringstream ss;
	int x;
	vector<int>vec;
	for (int i = 0; i<vs.size(); i++) {
		ss << vs[i];
		ss >> x;
		vec.push_back(x);
		ss.clear();
	}
	vector<int>vi;
	for (int i = 0; i<vec.size() - 2; i++) {
		for (int j = i+1; j<vec.size() - 1; j++) {
			if (vec[i] + vec[j] == vec[vec.size() - 1]) {
				vi.push_back(i);
				vi.push_back(j);
			}
		}
	}
	int sum = 0;
	for (int i = 0; i<vi.size(); i++)
		sum += vi[i];
	cout << sum << endl;
	return 0;
}

发表于 2020-04-15 17:19:33 回复(0)
为什么同样的参数我在dev上得到的答案是18,在这儿是30😂
#include <iostream>
#include <cstring>
#include <cmath>
#include <vector>
using namespace std;

int main(){
	string str;
	vector<int> num;
	int sum;
	int biao;
	cin>>str;
	string temp="";
	for(int i=0;i<str.size();i++){
		if(str[i]!=','){
			temp+=str[i];
		}else{
			num.push_back(stoi(temp));
			temp="";
		}
	}

	biao = stoi(temp);
	
	for(int i=0;i<num.size();i++){
		for(int j=i+1;j<num.size();j++){
			if(biao == num[i] + num[j]){
				sum+=i;
				sum+=j;
			}
		}
	}
	cout<<sum;
	
	return 0;
} 

编辑于 2020-03-09 13:15:49 回复(0)
package study;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class two {
    

         public static void main(String[] args) {
             Scanner scan=new Scanner(System.in);
             
             int []arry=new int[8];
             int n=scan.nextInt();
             for(int i=0;i<8;i++){
             
             arry[i]=scan.nextInt();
            
               
            }
             ttt(arry,n);
         }

         public static void ttt(int []arry ,int n){
             List<Integer> list = new ArrayList<Integer>();
                    
                     

             for(int i=0;i<arry.length;i++){
                 
                 for(int y=i+1;y<arry.length;y++){
                     
                     
                     
                     
                     
                 if(arry[i]+arry[y]==n){
                     
                     list.add(i+y);
                  
                     
                     
                     
                 }
                 
                 
                 }
                 
                 
                 
             }
             int t=list.size();
                 int sum=0;
                 for(int i=0;i<t;i++){
                     
                     sum+=list.get(i);
                     
                     
                 }

                 
                 
                 System.out.println(sum);
                 
                 
                 
                 
                 
                 
             }




}

发表于 2020-03-01 18:51:34 回复(0)
qnk头像 qnk
用map,5ms
#include <iostream>
#include <algorithm>
#include <map>
using namespace std;
int gets(vector<int> b,int v)
{
    int n=b.size();
    int res=0;
    map<int,vector<int>> m;
    for(int i=0;i<n;i++)
    {
        int tmp=v-b[i];
        vector<int> vec;
        if(m.find(tmp)!=m.end())
        {
            vec=m.find(tmp)->second;
            for(int j=0;j<vec.size();j++)
                res=res+vec[j]+i;
        }
        vec=m[b[i]];
        vec.push_back(i);
        m[b[i]]=vec;
    }
    return res;
}
int main()
{
    vector<int> a;
    int m,cnt=0;
    char c;
    while(cin>>m)
    {
        a.push_back(m);
        cin>>c;
    }
    int n=a.size();
    int val=a[n-1];
    a.erase(a.end()-1) ;
    int res=gets(a,val);
    cout<<res;
    return 0;
}


发表于 2020-02-14 22:32:38 回复(0)
function getSum (str) {
    let strArr = str.split(',')
    let endNum = strArr.splice(strArr.length-1,1)[0]
    let sum = 0
    for (var i=0;i<strArr.length;i++){
        for (var j = i+1;j<strArr.length;j++){
            if(+strArr[i] + +strArr[j] == endNum){
                sum += i+j
            }
        }
    }
    return sum
}

发表于 2020-01-06 15:44:10 回复(0)
#include<iostream>
#include<map>
#include<vector>
using namespace std;
  
int main(){
    vector<int> l;
    map<int,int> des;
    map<int,int> count;
    char s;
    int x;
    int flag;
    int sum=0;
    while(cin>>x){
        l.push_back(x);
        cin>>s;
    }
    flag=l[l.size()-1];
      
    for(int i=0;i<l.size()-1;i++){
        count[l[i]]++;
        des[l[i]]=des[l[i]]+i;
    }
    for(int i=0;i<=flag/2;i++){
        if(count[i]!=0&&count[flag-i]!=0){
            if(flag-i!=i){
                sum+=((des[i])*count[flag-i]+(des[flag-i])*count[i]);
            }else{
                sum+=((des[i])*(count[i]-1));
            }
        }
    }
    cout<<sum<<endl;
    return 0;
}

用两个map内存不够,只通过三分之二的测试数据
编辑于 2019-12-11 16:13:39 回复(0)