0

我做了小算法,想用javascript来实现它。这是我的算法

data.json在这种格式的文件中有一个数据

[
"109 200",
"109 201",
"102 202",
"103 202"
]

我想做的是

  1. 创建四个数组容器,即 c1、c2、c3 和 c4。
  2. 将上述数据原样放入 c1 容器中
  3. 循环通过 c1 并将数据按以下格式放入 c4

    "109",
    "200",
    "109",
    "201",
    "102",
    "202",
    "103",
    "202"
    
  4. 循环通过 c1 并将它们以这种格式放入 c2

    "109,200"
    
  5. 然后检查 c3 是否为空,然后从 c2 读取第一个值并将其推入 c3。

  6. 重复步骤 4,但这次将来自 c1 的第二个数据,即“109 201”以这种格式放入 c2

    "109,201"
    
  7. 然后检查 c3 是否不为空,然后循环遍历 c2 并检查这两个值中的任何一个是否在 c4 中重复。如果重复,则重复第 6 步和第 7 步,直到从 data.json 中找到最少数量的数字。

该算法效率不高,但我仍然想使用它。

这是我的代码。

var teams = [],
    c1 = [], arr = [], left = [], right = [], j = 0,
    show = function () {
        var span = $('#list');

        $.getJSON('data/data.json', function (ids) {

            //c1.push(c);
            for (var i = 0; i < ids.length; i++) {
                var a = smallcontainer(ids);
                var b = bigcontainer(ids);
                var c;

                if (c1 == "") {
                    c = a[0].split(" ");
                    console.log(c);
                } else {

                }


                //console.log(c);
                var id = ids[i];
                teams = id;
                $('<li>' + id + '</li>').appendTo(span);
            }
        });
    },

    smallcontainer = function (teams) { //arr
        arr = [teams[j]];
        j++;
        return arr;
    },

    bigcontainer = function (ids) { //c3. in code it is left+right=result
        for (var i = 0; i < ids.length; i++) {
            var splitted = ids[i].split(" ");
            left.push(splitted[0]);
            right.push(splitted[1]);

        }
        var result = left.concat(right);
    };

更新

data.json 文件中的数据有四个团队,每个团队有两个成员以这种形式

"109 200" = Team 1
"109 201" = Team 2
"102 202" = Team 3
"103 202" = Team 4

所以现在我必须计算最少的人数,它必须从这个列表中的每个团队中选择一个成员并显示他们的 ID。所以上面的输出将是

109
202

最新更新

我还在等待帮助

解决方案

这是在 AlexBEll 和 PAEz 的帮助下的解决方案。我使用了下面的解决方案,基本上由 AlexBell 解决

var data = [
 "1009 2000", 
 "1009 2001", 
 "1002 2002", 
 "1003 2002", 
 "1004 2003", 
 "1005 2004", 
 "1006 2005", 
 "1007 2006", 
 "1007 2007", 
 "1008 2008", 
 "1009 2008", 
 "1010 2009", 
 "1011 2010", 
 "1012 2010"      
];

var first = [], second = [], result = {}, out = '';

//Separe the ids
for(var i = 0; i < data.length; i++){
    var el = data[i].split(' '); 
    first[i] = el[0];
    second[i] = el[1];
}

for(var k = 0; k < first.length; k++){

    //Count the elements
    var nOfFirst = countElemnts(first, first[k]);
    var nOfSecond = countElemnts(second, second[k]);

    //If the first is in more that second take it
    if(nOfFirst > nOfSecond){
        result[first[k]] = 0;
    //Else take the second        
    }else if(nOfFirst < nOfSecond){
        result[second[k]] = 0;
    //If is only one take it    
    }else{
        result[first[k]] = 0;
    }

}

function countElemnts(arr, el){
    var count = 0;
    for(var j = 0; j < arr.length; j++){
        if(arr[j] == el)
            count++;
    }
    //console.log(el+' : '+count);
    return count;
}

for(var n in result){
    out += 'The id n: '+n+' is in the list\n';
}

alert(out);
4

1 回答 1

2

这行得通吗?......

var teams=[
"109 200",
"109 201",
"102 202",
"103 202"
];

var members ={};

var matesId='109';

// Members that won
var wins={};

// First lets find out how many teams a member is in
for (var i=0,length=teams.length; i<length;i++){
  var temp = teams[i].split(' ');
  for (var z=0,zlength=temp.length;z<zlength;z++){
    if (!members[temp[z]]) members[temp[z]]={wins:0,totalTeams:0,id:temp[z]};
      members[temp[z]].totalTeams=members[temp[z]].totalTeams+1;
  }
    teams[i]=[members[temp[0]],members[temp[1]]];
}

for (var i=0,length=teams.length; i<length;i++){
  var member1=teams[i][0];
  var member2=teams[i][1];
  if (member1.totalTeams>member2.totalTeams){
    member1.wins=member1.wins+1;
  } else if (member1.totalTeams<member2.totalTeams){
    member2.wins=member2.wins+1;
  } else {
    member1.wins=member1.wins+1;
    member2.wins=member2.wins+1;
  }    
}

for (var i=0,length=teams.length; i<length;i++){
  var member1=teams[i][0];
  var member2=teams[i][1];
  if (member1.wins>member2.wins){
    if (wins[member2.id]!==true) wins[member1.id]=true;
  } else if (member1.wins<member2.wins){
    if (wins[member1.id]!==true) wins[member2.id]=true;
  } else if (!wins[member1.id] && !wins[member2.id]) {
    if (member1.id==matesId && member2.id==matesId) {
      wins[matesId]=true;
    } else{
     // A draw, so pick one
      Math.round(Math.random())==1 ? wins[member2.id]=true : wins[member1.id]=true;
    }
  }    
}

var keys=Object.keys(wins);
var results=[];
results.push(keys.length);
for (var i=0,length=keys.length; i<length;i++){
  results.push(keys[i]);
}
results=results.join('\n');
document.querySelector('#output').innerText=results;​

http://jsfiddle.net/PAEz/dLUqj/3/
编辑:对其进行了更新,使其更易于阅读。
编辑:意识到你不需要平局和胜利,只要胜利就可以了。
最后编辑:注意到一个小错误,现在应该都是。

于 2012-08-16T14:53:58.017 回答