Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Задача по JavaScript (https://javascript.ru/forum/misc/30820-zadacha-po-javascript.html)

wawandas 16.08.2012 23:17

Задачи по JavaScript
 
Реализуйте алгоритм, проверяющий если элемент матрицы MxN равен 0, тогда всем элементам данной строки и колонки присвоить 0.

var arr = [[1,2,3,4],
           [5,0,7,8], 
           [8,9,10,11]];


моё решение:

var arr = [[1,2,3,4],
           [5,0,7,8], 
           [8,9,10,11]];

		   
var vertical = 0;
var gorizont = 0;

//Циклы в которых мы находим 0 по вертикале и горизонтали

for (var i = 0; i < arr.length; ++i)   
	{  
	  for (var j = 0; j < arr[i].length; ++j)
		{
			if(arr[i][j] == 0)
				{
					vertical = j;
					gorizont = i;
				}
		}

	}
for (var g = 0; g < arr[gorizont].length; ++g)
	{
		arr[gorizont][g] = 0;
	}
	
for (var v = 0; v < arr.length; ++v)
	{
		for (var v2 = 0; v2 < arr[v].length; ++v2)
		{
			arr[v][vertical] = 0;
		}
	}
	
	
alert ('Ноль найден в строке: ' + gorizont + "\nв индексе: " + vertical);

	for (var key in arr)
		{
			document.write(arr[key] + '<br>');
		}


ПЫ.СЫ. опыта у меня мало, возможно его можно как-то оптимизировать, жду ваших предложений, спасибо за внимание :victory:

Deff 17.08.2012 00:32

<script type="text/javascript">
var arr = [[1,2,3,4,5], 
           [5,0,7,8,0], 
           [5,6,7,8,1],  
           [8,9,9,9,12]];

function Replacer(i,j) {
   for(var J in arr[i]){
      arr[i][J]=0;
   }
   for(var I in arr){
      arr[I][j]=0;
   }
}


TST_arr0=[];

for(var i in arr){

   for(var j in arr[i]){

      if(arr[i][j]==0){
	  TST_arr0.push([i,j]);
      }
   }

}

for(var i in TST_arr0){
  Replacer(TST_arr0[i][0],TST_arr0[i][1])
}

</script>


<script>
// Print
 var str=''
for(var i in arr){
    str+='['+arr[i].join(",")+']\n'
}
alert(str);
</script>

wawandas 17.08.2012 09:50

спасибо!;)

daima 17.08.2012 15:00

не совсем в тему, но как создать циклами массив массивов?

lord2kim 17.08.2012 15:08

daima,
var mas = [];
for (i=0; i < 10; i++) {
  mas[i] = [];
  for (j=0; j < 10; j++) {
     mas[i][j] = j;
  }
}
alert(mas);

daima 17.08.2012 15:45

а сразу : mas[0][0] = 10; ?
а если там будут не значения, а хеши, т.е mas=[[{qq:1,ww:2},...?

Deff 17.08.2012 16:04

daima,
mass=[];mass.push([10]);

alert(mass[0][0]);

daima 17.08.2012 16:21

Супер, спасибо, буду знать. а с хешами как?

wawandas 17.08.2012 16:41

Ребята! подскажите пожалуйста как извлечь уникальные значения из массива:

var array = [1,2,3,4,1,2,6,7];

заранее спасибо!

daima 17.08.2012 16:48

берм 1е значение и снова пробегаемся по массиву если нету - выводим и т.д.

wawandas 17.08.2012 16:57

да, но не работает должным образом (((

var newStr = '';

var array = [1,2,3,4,1,2,6,7];

for (var i in array)
	{
		for (var j in array)
			{
				if (array[i] != array[j])
					{
						newStr += array[i];
					}
				
			}
	}

alert(newStr);


решил с помощью array_unique()

Dim@ 17.08.2012 18:57

wawandas,
люблю тех кто учиться и не хамит + тебе (это я такой добрый после общения с троллями:) )
держи бро:
var mass1 = [1, 2, 3, 2, 4, 5, 6, 7, 8];
var mass2 = [45,1, 3, 3, 1, 12, 12, 45];
function prov(mass){
 for (var i = 0; i < mass.length; i++){
  for (var j = i; j < mass.length; j++){
   if (i != j){
    if (mass[i] == mass[j]){
     alert("Нумерация с нуля - mass[" + i + "] == mass[" + j + "]\n" + mass[i] + " == " + mass[j]);
    }
   }
  }
 }
}
prov(mass1);
prov(mass2);

Deff 17.08.2012 19:21

Цитата:

Сообщение от wawandas
Ребята! подскажите пожалуйста как извлечь уникальные значения из массива:

var newStr = '';
 var array = [1,1,3,4,1,1,6,7];
 var str = array.join(",");

var Sin=str;
function Replacer(str, p1, offset, s) {
  var reg = '/'+p1+',?/g';
  var reg2 = '/'+p1+',?/';
  var s2;
  var s2=Sin.replace(eval(reg2),'');
  var s3=s2.replace(eval(reg),'')
  if(s3!=s2)Sin=s3;
  return p1 +',';
} 
 str = str.replace(/(\d*?),/g,Replacer).replace(/^.*?$/g,Sin).split(",");
alert(str);

Dim@ 17.08.2012 19:22

Deff,
:blink: :blink:

wawandas 17.08.2012 20:41

Dim@,
взаимно ;)

wawandas 17.08.2012 20:42

Deff,
было бы здорово если бы 1цу тоже выводило :-? , всем спасибо за труды и внимание!

Deff 17.08.2012 20:44

wawandas,
Ващет мой кривой код, посколь расчитан на 1 цифру в любом числе,
Единицу не выводит - она у меня повторяецо - см.исходный массив


Вродь Поправил
<script type="text/javascript">
var newStr = '';
 var array = [111,1,111,2,33,3,44,5,33,44,6,77,77];
 var str = array.join(",")+",";

var Sin=str;
function Replacer(str, p1, offset, s) {
  var reg = '/'+p1+',?/g';
  var reg2 = '/'+p1+',?/';
  var s2;
  var s2=Sin.replace(eval(reg2),'');
  var s3=s2.replace(eval(reg),'')
  if(s3!=s2)Sin=s3;
  return p1 +',';
} 
str = str.replace(/(\d*?),/g,Replacer).replace(/^.*?$/g,Sin);
str=str.substring(0,str.length-1).split(",");
alert(str);

</script>

wawandas 17.08.2012 21:17

var arr = [1,2,3,4,1,2,6,7];

var tmp_arr = new Array();

	for (i = 0; i < arr.length; i++) 
    {
		if (tmp_arr.indexOf(arr[i]) == "-1") 
        {
			tmp_arr.push(arr[i]);
		}
	}
      

alert(tmp_arr);

Deff 17.08.2012 21:34

wawandas,
[JS run]Тут код[/JS]

wawandas 17.08.2012 21:40

спасибо!

lord2kim 17.08.2012 21:45

wawandas, последний цикл лишний
var arr = [1,2,3,4,1,2,6,7];
 
var tmp_arr = new Array();
 
var view = '';
       
    for (i = 0; i < arr.length; i++)
    {
        if (tmp_arr.indexOf(arr[i]) == "-1")
        {
            tmp_arr.push(arr[i]);
        }
    }
       
/*for(var i in tmp_arr)
{
    view += tmp_arr[i] + ',';
}
 
alert(view)*/
alert(tmp_arr);

Deff 17.08.2012 22:12

var newStr = '';
 var arr = [111,1,111,2,33,3,44,5,33,44,6,77,77];
 var Obj={};

 for(i in arr){
   Obj[arr[i]]=true;
 }
 var arrOut=[]
  for(key in Obj){
   arrOut.push(key);
 }
alert(arrOut)

daima 19.08.2012 11:21

Цитата:

Сообщение от Deff (Сообщение 198379)
for(i in arr){
Obj[arr[i]]=true;
}

а как это расшифровывается? не догоню смысл

Deff 19.08.2012 11:41

daima,
Присваиваем в объекте названиям свойств(или хешей) = значения элементов массива, если имена свойств совпадают - то считаецо: что присваиваецо значение true одному и тому же свойству- а колво свойств объекта будет равно неповторяющимся именам(бывшим значениям массива)

wawandas 19.08.2012 13:10

Люди добыре! помогите понять почему...

Задача вставить элемент span с текстом "Price:" перед элементом span c классом "inner_block".

код...

<div class = "inner_block">
		<span class="item_title">Boots</span>
		<span>$150.00</span>
		<a href="#">Add To Backet</a>
		<span>Price:</span>
</div>


var elem = document.querySelector("div.inner_block");
		var elemSpan = document.querySelector("span.item_title");
		var lastElem = elem.lastElementChild;

			function insertAfter(parent, node, referenceNode) 
				{
					parent.insertBefore(node, referenceNode.nextSibling);
				}
	    insertAfter(elem, lastElem, elemSpan);


js вставляет туда куда нужно, но пропадает пробел (((

до:

Boots $150.00 Add To Backet Price:

после:

BootsPrice: $150.00 Add To Backet

почему так может получаться?

p.s. после выполнения скрипта в firebag видно что тег span стоит как задуманно

Deff 19.08.2012 13:41

<span> Price:</span>

<div class = "inner_block">
		<span class="item_title">Boots</span>
		<span>$150.00</span>
		<a href="#">Add To Backet</a>
		<span> Price:</span>
</div>


<script type="text/javascript">
var elem = document.querySelector("div.inner_block");
		var elemSpan = document.querySelector("span.item_title");
		var lastElem = elem.lastElementChild;

			function insertAfter(parent, node, referenceNode) 
				{
					parent.insertBefore(node, referenceNode.nextSibling);
				}
	    insertAfter(elem, lastElem, elemSpan);

</script>

wawandas 19.08.2012 13:51

да, но эт не выход если у меня таких span>price еще 3 штуки ((

всё же хотелось бы понять почему так происходит :(

wawandas 20.08.2012 12:02

Господа,

как реализовать алгоритм который будет проверять является ли строка ротацией другой строки, пример: 'panama' являеться ротацией 'amapan'

я так понимаю что здесь нужно использовать регулярки, поправте меня если я ошибаюсь.

nerv_ 20.08.2012 12:21

Цитата:

Сообщение от wawandas
я так понимаю что здесь нужно использовать регулярки

не обязательно. Погуглите нечеткий поиск, метрики "сходства" строк

Deff 20.08.2012 12:40

<script type="text/javascript">
str1='panama' 
str2='amapan'

function TstСircular_movement(S1,S2) {
 var lenS1=S1.length,lenS2=S2.length;
 if(lenS1==lenS2){
   var s1=S1.split('');
   for(i in s1){
     alert(s1.join(''))
     if(S2==s1.join(''))return i; 
     s1.unshift(s1.pop())
   }
 }
 return -1;
} alert(TstСircular_movement(str1,str2)) //Возвращаем сдвиг или -1
</script>

wawandas 20.08.2012 12:43

Deff, спасибо вам! отличная пища для ума!:victory:

nerv_ 20.08.2012 15:00

Цитата:

Сообщение от wawandas
как реализовать алгоритм который будет проверять является ли строка ротацией другой строки, пример: 'panama' являеться ротацией 'amapan'

еще раз прочитал задачу. Могу ошибаться, но в вашем случае будет достаточно: собрать хеш букв одной строки (какая именно буква + ее количество) и сверить его с другой.

nerv_ 20.08.2012 15:44

еще вариант
var text = '12345';
var i = text.length;
var len = i - 1;
var line = text;

while( i-- ) {
    line = line.slice( -1 ) + line.slice( 0, len );
    alert( line ) ;
}

Deff 20.08.2012 15:49

nerv_,

Там я продинамил второй Вариант - кады сдвиг против часовой

wawandas 20.08.2012 15:59

Deff,
nerv_,

громадное спасибище за внимание и старания!

oneguy 20.08.2012 16:28

Цитата:

Сообщение от wawandas
как реализовать алгоритм который будет проверять является ли строка ротацией другой строки, пример: 'panama' являеться ротацией 'amapan'

Ещё такое решение:
function TstСircular_movement(s1, s2) {
  if (s1.length!=s2.length)
    return -1;
  else return (s1+s1).indexOf(s2);
}
//тесты
alert(TstСircular_movement("panama", "amapan"));
alert(TstСircular_movement("panama", "panama"));
alert(TstСircular_movement("panama", "amapana"));

Deff 20.08.2012 16:36

oneguy, +
Классная идея!!!

oneguy 20.08.2012 16:43

Deff,
спасибо!
Учитывать отрицательные сдвиги не имеет смысла, так как они эквивалентны положительным сдвигам величиной n-i, где n - длина строки, а i - величина отрицательного сдвига.

wawandas 20.08.2012 16:45

oneguy,
спасибо!

удивляюсь тому, сколько может быть решений у одной задачи :blink:

Deff 20.08.2012 16:45

Цитата:

Сообщение от oneguy
Учитывать отрицательные сдвиги не имеет

oneguy,
я сообразил (- затёр


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