Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Помогите решить задачу с массивами (https://javascript.ru/forum/misc/37909-pomogite-reshit-zadachu-s-massivami.html)

Konstan_G 13.05.2013 18:25

Помогите решить задачу с массивами
 
Всем привет! Я чайник в JS помогите разобраться с задачами.

Задача №1
Реализовать алгоритм. Дан массив целых чисел с индексами от 0 до N, необходимо реализовать поиск числа A среди элементов массива.
Выводим на экран номер найденного числа, иначе выводим строку 'Not found'.

Задача №2
Реализовать алгоритм. Дано два массива чисел с индексами от 0 до N, необходимо вывести на экран все числа которые одновременно присутствуют в обоих массивах.

animhotep 13.05.2013 18:34

привет! что конкретно не понятно? или хотите чтоб с нуля написали

Konstan_G 13.05.2013 18:39

лучше с нуля потому что вообще не пойму как это сделать. Почитал про массивы, как применить так и не понял.

animhotep 13.05.2013 18:41

тогда лучше перенести в раздел работа

animhotep 13.05.2013 23:42

еслиб хоть какое-то начало было. а так выходит у меня какое-то задание а вы делайте

Demath 14.05.2013 03:36

Цитата:

Сообщение от Konstan_G
Задача №1
Реализовать алгоритм. Дан массив целых чисел с индексами от 0 до N, необходимо реализовать поиск числа A среди элементов массива.
Выводим на экран номер найденного числа, иначе выводим строку 'Not found'.

Например, так (максимальное время работы - O(n))

function findElem(A,Arr)
{
    var n=Arr.length, i=0;
 
    while (Arr[i]!=A && i<n) i++;
 
    if (i<n) alert(i);
    else alert('Not found');
}


Цитата:

Сообщение от Konstan_G
Задача №2
Реализовать алгоритм. Дано два массива чисел с индексами от 0 до N, необходимо вывести на экран все числа которые одновременно присутствуют в обоих массивах.

В исходных массивах могут быть повторяющиеся элементы?

рони 14.05.2013 08:06

:)
function findElem(A,Arr)
{
    var i=Arr.length;
    while (--i&&Arr[i]!=A) ;
    alert(i<0?'Not found':i);
}
var Arr = [1, 2, 3, 4, 5, 6, 7, 8, 19, 9, 16, 15, 65, 0];
findElem(9,Arr)

Hekumok 14.05.2013 16:19

№1
var array = [1, 2, 3, 4, 5] ;
function find(number) {
  var pos = array.indexOf(number) ;
  if(!~pos)
    pos = "Not found" ;
  alert(pos) ;
} ;
find(1) ;
find(6) ;
find(5) ;

№2
var array1 = [1, 2, 3, 4, 5], array2 = [1, 6, 0, 2, 5], array3 = [0, 3, 4, 7, 2] ;
function findElems(arr1, arr2) {
  return arr1.slice(0).filter(function(x) {
    if(~arr2.indexOf(x))
      return true ;
  }) ;
} ;
alert(findElems(array1, array2)) ;
alert(findElems(array1, array3)) ;
alert(findElems(array2, array3)) ;

В ишаке это, по-моему, не работает

awoth 14.05.2013 23:37

Здравствуйте,
Я новичек в JS, с имплементацией худо бедно справляюсь когда появляется необходимость но в этот раз гугл мне не помог (не смог разобраться с семантикой)- прошу помощи у вас.
Мне необходимо из многомерного массива вытащить элемент при совпадении соседних.
К примеру дано:
var parts=[ { type: 'b#1',		
							model: 'FD016',		//part#
							width: 24,			//param1
							depth: 48			//param2 
							},
						{ type: 'b#1',		//use
							model: 'FD017',		//part#
							width: 24,			//param1
							depth: 60			//param2 
							},
						{ type: 'b#2',		//use
							model: 'FD018',		//part#
							width: 24,			//param1
							depth: 72			//param2
							},
						{ type: 'b#2',		//use
							model: 'FD019',		//part#
							width: 24,			//param1
							depth: 96   		//param2
							},
						{ type: 'b#3',		//use
							model: 'FD020',		//part#
							width: 24,			//param1
							depth: 120  		//param2
							},
						{ type: 'b#3',		//use
							model: 'FD021',		//part#
							width: 24,			//param1
							depth: 48			//param2
							},
						];
			var depth = $('input[id=depth]').attr("value");
			var width = $('input[id=width]').attr("value");

Надо внести в инпут - model у которого width & depth совпадают с переменными


Пробовал


parts.filter(function (el) {
			 return parts.indexOf(el[width]);
			});
                       $('input[id=width]').val(parts.indexOf(el[width]));

Hekumok 15.05.2013 00:38

awoth,
var parts = [{
  type: 'b#1',
  model: 'FD016',
  width: 24,
  depth: 48
}, {
  type: 'b#1',
  model: 'FD017',
  width: 24,
  depth: 60
}, {
  type: 'b#2',
  model: 'FD018',
  width: 24,
  depth: 72
}, {
  type: 'b#2',
  model: 'FD019',
  width: 24,
  depth: 96
}, {
  type: 'b#3',
  model: 'FD020',
  width: 24,
  depth: 120
}],
input = $("#input") ; // ваш input, куда нужно вставить model
function find() {
  var depth = $('#depth').attr("value"),
  width = $('#width').attr("value") ;
  parts.some(function(x) {
    if(x.width == width && x.depth == depth) {
      input.val(x.model) ;
      return true ;
    } ;
  }) ;
}
// и когда вам нужно вызываете функцию find()

Demath 15.05.2013 02:28

Цитата:

Сообщение от рони (Сообщение 250371)
:)
function findElem(A,Arr)
{
    var i=Arr.length;
    while (--i&&Arr[i]!=A) ;
    alert(i<0?'Not found':i);
}
var Arr = [1, 2, 3, 4, 5, 6, 7, 8, 19, 9, 16, 15, 65, 0];
findElem(9,Arr)

Неверно :)
Вместо 'Not found' будет 0.

рони 15.05.2013 02:34

Цитата:

Сообщение от Demath
Вместо 'Not found' будет 0.

пример можно? где функция покажет неверный ответ???

Demath 15.05.2013 02:37

Например

<script>
function findElem(A,Arr)
{
    var i=Arr.length;
    while (--i&&Arr[i]!=A) ;
    alert(i<0?'Not found':i);
}

</script>
<button onclick="findElem(-5,[1, 2, 3, 4, 5, 6, 7, 8, 19, 9, 16, 15, 65, 0])">Пример</button>

Всегда будет 0, когда элемента нет в массиве.

рони 15.05.2013 02:57

Demath,
ок!
function findElem(A,Arr)
{
    var i=Arr.length;
    while (i--&&Arr[i]!=A) ;
    alert(i<0?'Not found':i);
}
findElem(-5,[1, 2, 3, 4, 5, 6, 7, 8, 19, 9, 16, 15, 65, 0])

Demath 15.05.2013 03:05

Цитата:

Сообщение от Konstan_G
Всем привет! Я чайник в JS помогите разобраться с задачами.

Задача №2
Реализовать алгоритм. Дано два массива чисел с индексами от 0 до N, необходимо вывести на экран все числа которые одновременно присутствуют в обоих массивах.

Например, так (учитываются повторяющиеся элементы)

<script type="text/javascript">
function getIntersection(A,B)
{
    A.sort(function(a,b){return a-b;});    //Сортировка А и B по возрастанию.
    B.sort(function(a,b){return a-b;});

    var a0=A[0], b0=B[0], k1=1, k2=1;
 
    for (var i=1; i<A.length; i++)                  //Удаление повторяющихся элементов
      { if (A[i]!=a0){ A[k1++]=A[i]; a0=A[i]; } }   // в сортированных массивах А и B.
    A.length = k1;
 
    for (var i=1; i<B.length; i++)
      { if (B[i]!=b0) { B[k2++]=B[i]; b0=B[i]; } }        
    B.length = k2;

    var N = A.length, M = B.length, C = [];

    for (var i=0, j=0, k=0, m=0; k<N+M; k++)     //Слияние A и B в С с сохранением упорядоченности.
     { if (i==N){ C[k] = B[j++]; continue; }
       if (j==M){ C[k] = A[i++]; continue; }
       C[k] = (A[i]<B[j]) ? A[i++] : B[j++];
     }

    for (var i=1, j=0; i<C.length; i++)
     { if (C[i-1]==C[i]){ C[j++] = C[i-1]; } } //Удаление в C всех элементов,
    C.length = j;                              // кроме дублирующих.

    return C;
}
</script>
<button onclick="alert( getIntersection([-1,3,-4,5,2,6],[-1,0,8,1,2,9,3,-4,5,7]) )">Пример</button>

рони 15.05.2013 03:27

:write:
Вариант )))
function getIntersection(c, d) {
    var a = {};
    c.map(function (b) {
        a[b] = !0
    });
    return a = d.filter(function (b) {
        return a[b]
    })
};
alert( getIntersection([-1,3,-4,5,2,6],[-1,0,8,1,2,9,3,-4,5,7]) )

awoth 15.05.2013 04:01

Спасибо за помощь,
по логике - все должно работать,
результат пока не получил - добавил сами инпуты и кнопку с вызовом функции - выдает $ is not defined
...	
input = $('#input1') ; // ваш input, куда нужно вставить model
	
	function find() {
	  var depth = $('#depth').attr("value"),
	  width = $('#width').attr("value") ;
	  parts.some(function(x) {
	    if(x.width == width && x.depth == depth) {
	      input.val(x.model) ;
		  alert (input.val(x.model));
	      return true ;
	    } ;
	  }) ;
	}
    </script>
<input id="input1" name="input1" value="" type="text" />
<input id="depth" name="depth" value="60" type="text" />
<input id="width" name="width" value="24" type="text" />
<input name="submit" type="button" value="submit" onclick="find()" />

P.S. по идее можно ведь прописать инфу строкой - разбивая на массив по 3 элемента выяснять совпадение первых двух с заданными переменными и при совпадении присваивать значение 3го элемента инпуту... пойду почитаю как сплит работает.

P.P.S скрипт после доработки напильником отлично встроился на место и функционирует, Спасибо от души сообществу и лично Hekumok.

рони 15.05.2013 08:34

nasqad,
Вариант не ловит повторы и ноль ....
function getIntersection(a, b) {
    return a.filter(function (c) {
        return b.indexOf(c) != -1 && c;
    })
};
alert( getIntersection([0,-1,3,-4,5,2,6,3,3,3,3],[-1,0,8,1,2,9,3,-4,5,7,0]) )
function get(c, d) {
    var a = {};
    c.map(function (b) {
        a[b] = !0
    });
    return a = d.filter(function (b) {
        return a[b]? (a[b]=!1,!0):!1

    })
};
alert( get([0,-1,3,-4,5,2,6,3,3,3,3],[-1,0,8,1,2,9,3,-4,5,7,0]) )

рони 15.05.2013 10:44

nasqad,
интересно повторы одновременно присутствуют во втором массиве в котором их нет ? :write:

awoth 17.05.2013 19:50

Цитата:

...	
input = $('#input1') ; // ваш input, куда нужно вставить model
	
	function find() {
	  var depth = $('#depth').attr("value"),
	  width = $('#width').attr("value") ;
	  parts.some(function(x) {
	    if(x.width == width && x.depth == depth) {
	      input.val(x.model) ;
		  alert (input.val(x.model));
	      return true ;
	    } ;
	  }) ;
	}
    </script>
<input id="input1" name="input1" value="" type="text" />
<input id="depth" name="depth" value="60" type="text" />
<input id="width" name="width" value="24" type="text" />
<input name="submit" type="button" value="submit" onclick="find()" />

Такой вопрос - функция some не поддоерживается ИЕ ниже 9ти,
Нашел вроде обьяснение как сделать аналог для ИЕ но применить не получается (http://www.tutorialspoint.com/javascript/array_some.htm)
может кто помочь в данном вопросе?
Тестил варианты типа
if (!Array.prototype.some)
{
 var bench=[{a:1, b:9}{a:2,b:11}];
  Array.prototype.some = function(fun /*, thisp*/)
  {
    var len = this.length;
    if (typeof fun != "function")
      throw new TypeError();

    var thisp = arguments[1];
    for (var i = 0; i < len; i++)
    {
      if (i in this &&
          fun.call(thisp, this[i], i, this))
        return true;
    }
    return false;
  };
}

function isBigEnough(element, index, array) {
  return (element >= 10);
}

var retval = bench.some(isBigEnough);
document.write("Returned value is : " + retval );

не пашет 8(

awoth 17.05.2013 19:59

сорри - ответ прост как никогда, видимо заработался с этим скриптом.
достаточно просто вставить сам преобразователь перед функцией и ИЕ8 сможет работать с some()
if (!Array.prototype.some)
{
  Array.prototype.some = function(fun /*, thisp*/)
  {
    var len = this.length;
    if (typeof fun != "function")
      throw new TypeError();

    var thisp = arguments[1];
    for (var i = 0; i < len; i++)
    {
      if (i in this &&
          fun.call(thisp, this[i], i, this))
        return true;
    }

    return false;
  };
}


Часовой пояс GMT +3, время: 04:54.