Всем привет!
Продолжаем разбираться с задачами для начинающих. Дядя Коля немного удивлен темпами обучения, но что делать – надо разбираться. Надеюсь, данная статья будет полезна не только ему.
Задача.
Напишите функцию, которая определяет, сколько различных чисел в заданном массиве.
Алгоритм решения.
Предлагаю такой вариант решения.
Внешним циклом идем по массиву слева направо. Внутренним циклом идем назад от текущего элемента. И проверяем встречались ли ранее в массиве такие же значения, как у текущего элемента. Если не встречались, то увеличиваем счетчик уникальных чисел на единицу.
Подробное описание решения.
Например, пусть исходный массив arr=[0,1,2,4,4]. Нулевой элемент сразу засчитываем в уникальные, поскольку, если массив состоит из одного элемента, то он содержит одно уникальное число – этот факт не требует проверки. Поэтому счетчику уникальных чисел сразу присваиваем 1, а проход внешним циклом начинаем слева-направо с элемента 1. (Естественно в начале функции добавим проверку на пустой массив, в этом случае вернем 0). В данной итерации внутренний цикл просматривает элементы, расположенные слева от 1, т.е. сейчас это единственный элемент 0. Сравниваем 1 и 0, поскольку они не равны, то счетчик увеличиваем на 1. Т.е. у нас уже 2 уникальных элемента. Внешний цикл переходи на элемент 2. Внутренний идет по элементам слева от 2, т.е. 1 и 0. Поскольку 2 не равно ни 1, ни 0, то счетчик уникальных чисел опять увеличиваем на 1 и т.д.
Код javascript:
var arr = [1,1,2,2,3,3,4,4,5,5];
function count_unique_num(arr) {
/* если массив пустой, то количество уникальных элементов равно 0*/
if (arr.length == 0) {
return 0;
}
var unique_cnt = 1; // счетчик уникальных чисел
var unique_flag = true; // флаг уникальности проверяемого числа
for (var i = 1; i < arr.length; i++) {
unique_flag = true; // по умолчанию считаем текущее число уникальным
/* проходим массив в обратном порядке, начиная с элемента arr[i-1] */
for (var j=i-1; j >= 0; j--) {
/* если ранее в массиве уже встречались элементы
с таким же значение как и у текущего,
то изменяем значение флага уникальности на false */
if (arr[j] == arr[i]) {
unique_flag = false;
}
}
/* если значение флага уникальности равно true,
то увеличиваем счетчик уникальных чисел на единицу
*/
if (unique_flag) {
unique_cnt++;
}
}
return unique_cnt;
}
document.write(count_unique_num(arr));
var arr = [1,1,2,2,3,3,4,4,5,5];
function count_unique_num(arr) {
/* если массив пустой, то количество уникальных элементов равно 0*/
if (arr.length == 0) {
return 0;
}
var unique_cnt = 1; // счетчик уникальных чисел
var unique_flag = true; // флаг уникальности проверяемого числа
for (var i = 1; i < arr.length; i++) {
unique_flag = true; // по умолчанию считаем текущее число уникальным
/* проходим массив в обратном порядке, начиная с элемента arr[i-1] */
for (var j=i-1; j >= 0; j--) {
/* если ранее в массиве уже встречались элементы
с таким же значение как и у текущего,
то изменяем значение флага уникальности на false */
if (arr[j] == arr[i]) {
unique_flag = false;
}
}
/* если значение флага уникальности равно true,
то увеличиваем счетчик уникальных чисел на единицу
*/
if (unique_flag) {
unique_cnt++;
}
}
return unique_cnt;
}
document.write(count_unique_num(arr));
Надеюсь, все понятно. Если что-то не понятно, то задавайте вопросы.
До скорых встреч.