Какое число не содержится в массиве
У меня есть массив чисел от 1 до 100 (включительно). Размер массива 100. Числа случайным образом добавляются в массив, но в массиве есть один случайный пустой слот.
Каков самый быстрый способ найти этот слот, а также номер, который должен быть помещен в слот? Решение Java предпочтительнее.
30 ответов
вы можете сделать это в O (n). Перебираем массив и вычислить сумму всех чисел. Теперь сумма натуральных чисел от 1 до N может быть выражена как Nx(N+1)/2. В вашем случае N=100.
вычесть сумму массива из Nx(N+1)/2, где N=100.
это недостающее число. Пустой слот может быть обнаружен во время итерации, в которой вычисляется сумма.
// will be the sum of the numbers in the array.
int sum = 0;
int idx = -1;
for (int i = 0; i < arr.length; i++)
{
if (arr[i] == 0)
{
idx = i;
}
else
{
sum += arr[i];
}
}
// the total sum of numbers between 1 and arr.length.
int total = (arr.length + 1) * arr.length / 2;
System.out.println(“missing number is: ” + (total – sum) + ” at index ” + idx);
мы можем использовать операцию XOR, которая безопаснее суммирования, потому что в языках программирования, если данный вход большой, он может переполниться и может дать неправильный ответ.
прежде чем перейти к решению, знать, что A xor A = 0. Поэтому, если мы XOR два одинаковых числа значение равно 0.
Теперь, XORing [1..n] с элементами, присутствующими в массиве, отменяет одинаковые числа. Так что в конце мы получим недостающий номер.
// Assuming that the array contains 99 distinct integers between 1..99
// and empty slot value is zero
int XOR = 0;
for(int i=0; i<100; i++) {
if (ARRAY[i] != 0)
XOR ^= ARRAY[i];
XOR ^= (i + 1);
}
return XOR;
int a[] = new int[n];
//XOR of all numbers from 1 to n
// n%4 == 0 —> n
// n%4 == 1 —> 1
// n%4 == 2 —> n + 1
// n%4 == 3 —> 0
long xor = (n % 4 == 0) ? n : (n % 4 == 1) ? 1 : (n % 4 == 2) ? n + 1 : 0;
for (long i = 1; i <= n; i++)
{
xor = xor ^ a[i];
}
//Missing number
System.out.println(xor);
вот простая программа для поиска недостающих чисел в целочисленном массиве
ArrayList<Integer> arr = new ArrayList<Integer>();
int a[] = { 1,3,4,5,6,7,10 };
int j = a[0];
for (int i=0;i<a.length;i++)
{
if (j==a[i])
{
j++;
continue;
}
else
{
arr.add(j);
i–;
j++;
}
}
System.out.println(“missing numbers are “);
for(int r : arr)
{
System.out.println(” ” + r);
}
5050 – (сумма всех значений в массиве) = недостающее количество
int sum = 0;
int idx = -1;
for (int i = 0; i < arr.length; i++) {
if (arr[i] == 0) idx = i; else sum += arr[i];
}
System.out.println(“missing number is: ” + (5050 – sum) + ” at index ” + idx);
по аналогичному сценарию,если массив уже отсортирован, он не включает дубликаты и только один номер отсутствует, можно найти это отсутствующее число в log (n) time, используя бинарный поиск.
public static int getMissingInt(int[] intArray, int left, int right) {
if (right == left + 1) return intArray[right] – 1;
int pivot = left + (right – left) / 2;
if (intArray[pivot] == intArray[left] + (intArray[right] – intArray[left]) / 2 – (right – left) % 2)
return getMissingInt(intArray, pivot, right);
else
return getMissingInt(intArray, left, pivot);
}
public static void main(String args[]) {
int[] array = new int[]{3, 4, 5, 6, 7, 8, 10};
int missingInt = getMissingInt(array, 0, array.length-1);
System.out.println(missingInt); //it prints 9
}
3
автор: Konstantinos Chalkias
Это C#, но это должно быть довольно близко к тому, что вам потребуется:
int sumNumbers = 0;
int emptySlotIndex = -1;
for (int i = 0; i < arr.length; i++)
{
if (arr[i] == 0)
emptySlotIndex = i;
sumNumbers += arr[i];
}
int missingNumber = 5050 – sumNumbers;
ну, используйте фильтр цветения.
int findmissing(int arr[], int n)
{
long bloom=0;
int i;
for(i=0; i<;n; i++)bloom+=1>>arr[i];
for(i=1; i<=n, (bloom<<i & 1); i++);
return i;
}
решение, которое не включает повторяющиеся дополнения или, возможно, формула n(n+1)/2 не доходит до вас во время интервью, например.
вы должны использовать массив из 4 ints (32 бита) или 2 ints (64 бита). Инициализировать последний int с помощью (-1 & ~(1 > 3. (биты, которые выше 100, установлены в 1) или вы можете установить биты выше 100, используя цикл for.
- пройдите через массив чисел и установите 1 для позиции бита, соответствующей номеру (например, 71 будет установлен на 3-м int на 7-м бит слева направо)
- пройдите через массив из 4 ints(32-разрядная версия) или 2 ints (64-разрядная версия)
public int MissingNumber(int a[])
{
int bits = sizeof(int) * 8;
int i = 0;
int no = 0;
while(a[i] == -1)//this means a[i]’s bits are all set to 1, the numbers is not inside this 32 numbers section
{
no += bits;
i++;
}
return no + bits – Math.Log(~a[i], 2);//apply NOT (~) operator to a[i] to invert all bits, and get a number with only one bit set (2 at the power of something)
}
пример: (32-разрядная версия) допустим, что отсутствует число 58. Это означает, что 26-й бит (слева направо) второго целого числа имеет значение 0.
первый int равен -1 (все биты установлены), поэтому мы переходим ко второму и добавляем к “нет” число 32. Второй int отличается от -1 (бит не установлен) Итак, применяя оператор NOT ( ~ ) к числу, мы получаем 64. Возможные числа-2 при мощности x, и мы можем вычислить x, используя log on base 2; в этом случае мы получим log2(64) = 6 => 32 + 32 – 6 = 58.
надеюсь, что это помогает.
Это не проблема поиска. Работодатель интересуется, есть ли у вас понимание контрольной суммы. Вам может понадобиться двоичный файл или цикл for или что-то еще, если вы ищете несколько уникальных целых чисел, но вопрос предусматривает “один случайный пустой слот.- В данном случае мы можем использовать сумму потока. Условие: “числа случайным образом добавляются в массив” бессмысленно без более подробной информации. Вопрос не предполагает, что массив должен начинаться с целого числа 1 и поэтому допускает начало смещения целое число.
int[] test = {2,3,4,5,6,7,8,9,10, 12,13,14 };
/*get the missing integer*/
int max = test[test.length – 1];
int min = test[0];
int sum = Arrays.stream(test).sum();
int actual = (((max*(max+1))/2)-min+1);
//Find:
//the missing value
System.out.println(actual – sum);
//the slot
System.out.println(actual – sum – min);
время успеха: 0.18 память: 320576 сигнал: 0
Я нашел это красивое решение здесь:
public class MissingNumberInArray
{
//Method to calculate sum of ‘n’ numbers
static int sumOfNnumbers(int n)
{
int sum = (n * (n+1))/ 2;
return sum;
}
//Method to calculate sum of all elements of array
static int sumOfElements(int[] array)
{
int sum = 0;
for (int i = 0; i < array.length; i++)
{
sum = sum + array[i];
}
return sum;
}
public static void main(String[] args)
{
int n = 8;
int[] a = {1, 4, 5, 3, 7, 8, 6};
//Step 1
int sumOfNnumbers = sumOfNnumbers(n);
//Step 2
int sumOfElements = sumOfElements(a);
//Step 3
int missingNumber = sumOfNnumbers – sumOfElements;
System.out.println(“Missing Number is = “+missingNumber);
}
}
поиск недостающего числа из ряда чисел. Чертенок следует помнить.
- массив должен быть отсортирован..
- функция не работает на нескольких пропусках.
последовательность должна быть AP.
public int execute2(int[] array) {
int diff = Math.min(array[1]-array[0], array[2]-array[1]);
int min = 0, max = arr.length-1;
boolean missingNum = true;
while(min<max) {
int mid = (min + max) >>> 1;
int leftDiff = array[mid] – array[min];
if(leftDiff > diff * (mid – min)) {
if(mid-min == 1)
return (array[mid] + array[min])/2;
max = mid;
missingNum = false;
continue;
}
int rightDiff = array[max] – array[mid];
if(rightDiff > diff * (max – mid)) {
if(max-mid == 1)
return (array[max] + array[mid])/2;
min = mid;
missingNum = false;
continue;
}
if(missingNum)
break;
}
return -1;
}
1
автор: Vrajendra Singh Mandloi
Я думаю, что самым простым и, возможно, самым эффективным решением было бы зациклить все записи и использовать битовый набор, чтобы запомнить, какие числа установлены, а затем проверить на 0 бит. Запись с 0 бита недостающее число.
эта программа находит недостающие цифры
<?php
$arr_num=array(“1″,”2″,”3″,”5″,”6”);
$n=count($arr_num);
for($i=1;$i<=$n;$i++)
{
if(!in_array($i,$arr_num))
{
array_push($arr_num,$i);print_r($arr_num);exit;
}
}
?>
одна вещь, которую вы можете сделать, это сортировать числа, используя быструю сортировку, например. Затем используйте цикл for для итерации по отсортированному массиву от 1 до 100. На каждой итерации вы сравниваете число в массиве с приращением цикла for, если обнаружите, что приращение индекса не совпадает со значением массива, вы нашли отсутствующее число, а также отсутствующий индекс.
Ниже приведено решение для поиска всех недостающих чисел из заданного массива:
public class FindMissingNumbers {
/**
* The function prints all the missing numbers from “n” consecutive numbers.
* The number of missing numbers is not given and all the numbers in the
* given array are assumed to be unique.
*
* A similar approach can be used to find all no-unique/ unique numbers from
* the given array
*
* @param n
* total count of numbers in the sequence
* @param numbers
* is an unsorted array of all the numbers from 1 – n with some
* numbers missing.
*
*/
public static void findMissingNumbers(int n, int[] numbers) {
if (n < 1) {
return;
}
byte[] bytes = new byte[n / 8];
int countOfMissingNumbers = n – numbers.length;
if (countOfMissingNumbers == 0) {
return;
}
for (int currentNumber : numbers) {
int byteIndex = (currentNumber – 1) / 8;
int bit = (currentNumber – byteIndex * 8) – 1;
// Update the “bit” in bytes[byteIndex]
int mask = 1 << bit;
bytes[byteIndex] |= mask;
}
for (int index = 0; index < bytes.length – 2; index++) {
if (bytes[index] != -128) {
for (int i = 0; i < 8; i++) {
if ((bytes[index] >> i & 1) == 0) {
System.out.println(“Missing number: ” + ((index * 8) + i + 1));
}
}
}
}
// Last byte
int loopTill = n % 8 == 0 ? 8 : n % 8;
for (int index = 0; index < loopTill; index++) {
if ((bytes[bytes.length – 1] >> index & 1) == 0) {
System.out.println(“Missing number: ” + (((bytes.length – 1) * 8) + index + 1));
}
}
}
public static void main(String[] args) {
List<Integer> arrayList = new ArrayList<Integer>();
int n = 128;
int m = 5;
for (int i = 1; i <= n; i++) {
arrayList.add(i);
}
Collections.shuffle(arrayList);
for (int i = 1; i <= 5; i++) {
System.out.println(“Removing:” + arrayList.remove(i));
}
int[] array = new int[n – m];
for (int i = 0; i < (n – m); i++) {
array[i] = arrayList.get(i);
}
System.out.println(“Array is: ” + Arrays.toString(array));
findMissingNumbers(n, array);
}
}
допустим, у вас есть n как 8, и наши номера варьируются от 0-8 для этого примера
мы можем представить двоичное представление всех 9 чисел следующим образом
Ноль ноль ноль ноль
Ноль ноль ноль один
Ноль ноль десять
Ноль ноль одиннадцать
Ноль сто
Ноль сто один
Ноль сто десять
Ноль сто одиннадцать
1000
в приведенной выше последовательности нет отсутствующих чисел, и в каждом столбце количество нулей и единиц совпадает, однако, как только вы удалите значение 1, скажем, 3, мы получим баланс в количестве 0 и 1 по столбцам. Если число 0 в столбце равно число 1 в этой битовой позиции, то эта битовая позиция будет 1. Мы тестируем биты слева направо и на каждой итерации выбрасываем половину массива для тестирования следующего бита, либо нечетные значения массива, либо четные значения массива выбрасываются на каждой итерации в зависимости от того, какой бит нам не хватает.
приведенное ниже решение находится в C++
int getMissingNumber(vector<int>* input, int bitPos, const int startRange)
{
vector<int> zeros;
vector<int> ones;
int missingNumber=0;
//base case, assume empty array indicating start value of range is missing
if(input->size() == 0)
return startRange;
//if the bit position being tested is 0 add to the zero’s vector
//otherwise to the ones vector
for(unsigned int i = 0; i<input->size(); i++)
{
int value = input->at(i);
if(getBit(value, bitPos) == 0)
zeros.push_back(value);
else
ones.push_back(value);
}
//throw away either the odd or even numbers and test
//the next bit position, build the missing number
//from right to left
if(zeros.size() <= ones.size())
{
//missing number is even
missingNumber = getMissingNumber(&zeros, bitPos+1, startRange);
missingNumber = (missingNumber << 1) | 0;
}
else
{
//missing number is odd
missingNumber = getMissingNumber(&ones, bitPos+1, startRange);
missingNumber = (missingNumber << 1) | 1;
}
return missingNumber;
}
на каждой итерация мы уменьшаем наше входное пространство на 2, i.e N, N/2, N/4 … = O (log N), с пробелом O(N)
//Test cases
[1] when missing number is range start
[2] when missing number is range end
[3] when missing number is odd
[4] when missing number is even
решение с PHP $n = 100;
$n*($n+1)/2 – array_sum($array) = $missing_number
и array_search($missing_number) даст индекс отсутствующего числа
автор: Saurabh Chandra Patel
// code in PHP5.5
$n=count($A);
for($i=1;$i<=$n;$i++) {
if(!in_array($i,$A)) {
return (int)$i;
}
}
}
========простейшее решение для отсортированного массива===========
public int getMissingNumber(int[] sortedArray)
{
int missingNumber = 0;
int missingNumberIndex=0;
for (int i = 0; i < sortedArray.length; i++)
{
if (sortedArray[i] == 0)
{
missingNumber = (sortedArray[i + 1]) – 1;
missingNumberIndex=i;
System.out.println(“missingNumberIndex: “+missingNumberIndex);
break;
}
}
return missingNumber;
}
здесь сложность программы занимает время O(logn) и сложность пространства O (logn)
public class helper1 {
public static void main(String[] args) {
int a[] = {1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 12};
int k = missing(a, 0, a.length);
System.out.println(k);
}
public static int missing(int[] a, int f, int l) {
int mid = (l + f) / 2;
//if first index reached last then no element found
if (a.length – 1 == f) {
System.out.println(“missing not find “);
return 0;
}
//if mid with first found
if (mid == f) {
System.out.println(a[mid] + 1);
return a[mid] + 1;
}
if ((mid + 1) == a[mid])
return missing(a, mid, l);
else
return missing(a, f, mid);
}
}
public static void main(String[] args) {
int array[] = {1,2,3,4,6};
int x1 = getMissingNumber(array,6);
System.out.println(“The Missing number is: “+x1);
}
private static int getMissingNumber(int[] array, int i) {
int acctualnumber =0;
int expectednumber = (i*(i+1)/2);
for (int j : array) {
acctualnumber = acctualnumber+j;
}
System.out.println(acctualnumber);
System.out.println(expectednumber);
return expectednumber-acctualnumber;
}
}
автор: Manash Ranjan Dakua
недавно у меня был подобный (не точно такой же) вопрос на собеседовании, а также я слышал от друга, который был задан точно такой же вопрос в интервью.
Итак, вот ответ на вопрос OP и еще несколько вариантов, которые можно потенциально задать.
Пример ответов приведен в Java, потому что, он заявил, что:
предпочтительнее решение Java.
решение 1:
массив чисел от 1 до 100 (включительно) … Числа случайным образом добавляются в массив, но в массиве есть один случайный пустой слот
public static int findMissing1(int [] arr){
int sum = 0;
for(int n : arr){
sum += n;
}
return (100*(100+1)/2) – sum;
}
объяснение:
Это решение (как и многие другие решения, размещенные здесь) основано на Формуле Triangular number, что дает нам сумму всех натуральных чисел от 1 до n (в данном случае n is 100). Теперь, когда мы знаем сумму, которая должна быть от 1 до 100 – нам просто нужно вычесть фактическую сумму существующих чисел в данном массиве.
решение 2:
массив чисел от 1 до n (это означает, что максимальное число неизвестно)
public static int findMissing2(int [] arr){
int sum = 0, max = 0;
for(int n : arr){
sum += n;
if(n > max) max = n;
}
return (max*(max+1)/2) – sum;
}
объяснение:
В этом решении, поскольку максимальное число не задано – нам нужно его найти. После нахождения максимального числа-логика та же.
решение 3:
массив чисел от 1 до n (максимальное число неизвестно), есть два случайных пустых слота в массиве
public static int [] findMissing3(int [] arr){
int sum = 0, max = 0, misSum;
int [] misNums = {};//empty by default
for(int n : arr){
sum += n;
if(n > max) max = n;
}
misSum = (max*(max+1)/2) – sum;//Sum of two missing numbers
for(int n = Math.min(misSum, max-1); n > 1; n–){
if(!contains(n, arr))misNums = new int[]{n, misSum-n};
}
return misNums;
}
private static boolean contains(int num, int [] arr){
for(int n : arr){
if(n == num)return true;
}
return false;
}
объяснение:
В этом решении максимальное число не задано (как и в предыдущем), но оно также может отсутствовать из двух чисел, а не одного. Итак, сначала мы находим сумму недостающих чисел-с той же логикой, что и раньше. Второй поиск меньшего числа между недостающей суммой и последней (возможно) missing number-уменьшить ненужный поиск. Третий с Javaмассив s (не коллекция) не имеет методов as indexOf или contains, я добавил небольшой многоразовый метод для этой логики. В-четвертых, когда первое отсутствующее число найдено, второе вычитается из недостающей суммы.
Если отсутствует только одно число, то второе число в массиве будет равно нулю.
Примечание
если вы хотите примеры в другие языки или другой интересные вариации этого вопроса, вы можете проверить мои Github хранилище интервью вопросы и ответы.
использовать формулу суммы,
class Main {
// Function to ind missing number
static int getMissingNo (int a[], int n) {
int i, total;
total = (n+1)*(n+2)/2;
for ( i = 0; i< n; i++)
total -= a[i];
return total;
}
/* program to test above function */
public static void main(String args[]) {
int a[] = {1,2,4,5,6};
int miss = getMissingNo(a,5);
System.out.println(miss);
}
}
ссылка https://www.geeksforgeeks.org/find-the-missing-number/
class A{
public static void main(String[] args){
int[] array = new int[200];
for(int i=0;i<100;i++){
if(i != 51){
array[i] = i;
}
}
for(int i=100;i<200;i++){
array[i] = i;
}
int temp = 0;
for(int i=0;i<200;i++){
temp ^= array[i];
}
System.out.println(temp);
}
}
int num=-1;
for (int i=1; i<=100; i++){
num =2*i;
if(arr[num]==0){
System.out.println(“index: “+i+” Array position: “+ num);
break;
}
else if(arr[num-1]==0){
System.out.println(“index: “+i+ ” Array position: “+ (num-1));
break;
}
}// use Rabbit and tortoise race, move the dangling index faster,
//learnt from Alogithimica, Ameerpet, hyderbad**
Если массив заполнен случайным образом, то в лучшем случае вы можете выполнить линейный поиск в o(n) сложности. Однако мы могли бы улучшить сложность до O (log n) путем подхода divide and conquer, аналогичного быстрой сортировке, как указано гири, учитывая, что числа были в порядке возрастания/убывания.
теперь я слишком резок с большими обозначениями O, но не могли бы вы также сделать что-то вроде (в Java)
for (int i = 0; i < numbers.length; i++) {
if(numbers[i] != i+1){
System.out.println(i+1);
}
}
где numbers-массив с вашими номерами от 1-100.
Из моего прочтения вопроса он не сказал, когда записать недостающее число.
альтернативно, если вы можете выбросить значение i+1 в другой массив и распечатать его после итерации.
конечно, это может не соответствовать правилам времени и пространства. Как я и сказал. Мне пришлось сильно освежить в большой О.
еще один вопрос домашней работы. Последовательный поиск-лучшее, что вы можете сделать. Что касается решения Java, считайте это упражнением для читателя. : P
Источник
На занятии объясняется, как работать с одномерными массивами в Паскале, как использовать генератор случайных чисел — функцию random в Паскале. Рассматривается пример того, как вывести числа Фибоначчи
Материалы сайта labs-org.ru направлены на практическое освоение языка программирования Pascal. Краткие теоретические сведения не претендуют на полное освещение материала по теме; необходимую информацию можно найти в сети Интернет в большом количестве. В наши же задачи входит предоставление возможности получения практических навыков программирования на Паскале. Решенные наглядные примеры и задания изложены по мере увеличения их сложности, что позволит с легкостью изучить материал с нуля.
Объявление массива
Массивы в Паскале используются двух типов: одномерные и двумерные.
Определение одномерного массива в Паскале звучит так: одномерный массив — это определенное количество элементов, относящихся к одному и тому же типу данных, которые имеют одно имя, и каждый элемент имеет свой индекс — порядковый номер.
Описание массива в Паскале (объявление) и обращение к его элементам происходит следующим образом:
var dlina: array [1..3] of integer;
begin
dlina[1]:=500;
dlina[2]:=400;
dlina[3]:=150;
…
Объявить размер можно через константу:
Инициализация массива
Кроме того, массив может быть сам константным, т.е. все его элементы в программе заранее определены. Описание такого массива выглядит следующим образом:
Заполнение последовательными числами:
Результат:
A[1] = 8, A[2] = 9, A[3] = 10, …, A[N] = A[N-1] + 1
Ввод с клавиатуры:
Пример: Рассмотрим, как происходит ввод массива в Паскале:
readln(n); {если кол-во заранее не известно, – запрашиваем его}
for i := 1 to n do begin
write(‘a[‘, i, ‘]=’);
read(a[i]);
…
end;
…
✍ Пример результата:
введите кол-во элементов:
3
a[1]=5
a[2]=7
a[3]=4
Вывод элементов массива
Пример: Рассмотрим, как вывести массив в Паскале:
1 2 3 4 5 6 7 8 9 10 11 12 13 | var a: array[1..5] of integer; {массив из пяти элементов} i: integer; begin a[1]:=2; a[2]:=4; a[3]:=8; a[4]:=6; a[5]:=3; writeln(‘Массив A:’); for i := 1 to 5 do write(a[i]:2); {вывод элементов массива} end. |
✍ Пример результата:
Для работы с массивами чаще всего используется в Паскале цикл for с параметром, так как обычно известно, сколько элементов в массиве, и можно использовать счетчик цикла в качестве индексов элементов.
Задача Array 0. Необходимо задать вещественный массив размерностью 6 (т.е. из шести элементов); заполнить массив вводимыми значениями и вывести элементы на экран. Использовать два цикла: первый — для ввода элементов, второй — для вывода.
Пример результата:
введите элемент массива: 3.0
введите элемент массива: 0.8
введите элемент массива: 0.56
введите элемент массива: 4.3
введите элемент массива: 23.8
введите элемент массива: 0.7
Массив = 3, 0.8, 0.56, 4.3, 23.8, 0.7
В данном примере работы с одномерным массивом есть явное неудобство: присваивание значений элементам.
Обработка массивов в Паскале, так же как и заполнение массива, происходит обычно с использованием цикла for.
Функция Random в Pascal
Для того чтобы постоянно не запрашивать значения элементов массива используется генератор случайных чисел в Паскаль, который реализуется функцией Random. На самом деле генерируются псевдослучайные числа, но суть не в этом.
Для генерации чисел от 0 до n (не включая само значение n, целые числа в интервале [0,N)) используется запись random (n).
Перед использованием функции необходимо инициализировать датчик случайных чисел с помощью процедуры randomize.
Диапазон в Паскале тех самых случайных чисел от a до b задается формулой:
Пример: Заполнение массива случайными числами в Pascal:
1 2 3 4 5 6 7 8 9 10 | var f: array[1..10] of integer; i:integer; begin randomize; for i:=1 to 10 do begin f[i]:=random(10); { интервал [0,9] } write(f[i],’ ‘); end; end. |
✍ Пример результата:
Для вещественных чисел в интервале [0,1]:
…
x := random(0.0,1.0);; { интервал [0,1] }
Задача Array 1. Необходимо задать массив размерностью 5, заполнить массив случайными числами в интервале [-1,1] и вывести элементы на экран: определить три позиции для вывода каждого элемента, с двумя знаками после запятой.
Пример результата:
Массив = 0.22 0.00 -0.69 -0.35 -0.11
Числа Фибоначчи в Паскале
Наиболее распространенным примером работы с массивом является вывод ряда чисел Фибоначчи в Паскаль. Рассмотрим его.
Пример: Ряд чисел Фибоначчи: 1 1 2 3 5 8 13…
f[0]:=1;
f[1]:=1;
f[2]:=2;
…или
f[2]:=f[0]+f[1];
f[3]:=f[1]+f[2];или
Получили формулу элементов ряда.
Пример: Вычислить и распечатать первые 20 чисел Фибоначчи.
1 2 3 4 5 6 7 8 9 10 11 | var i:integer; f:array[0..19]of integer; begin f[0]:=1; f[1]:=1; for i:=2 to 19 do begin f[i]:=f[i-1]+f[i-2]; writeln(f[i]) end; end. |
На данном примере, становится понятен принцип работы с числовыми рядами. Обычно, для вывода числового ряда находится формула определения каждого элемента данного ряда. Так, в случае с числами Фибоначчи, эта формула-правило выглядит как f[i]:=f[i-1]+f[i-2]. Поэтому ее необходимо использовать в цикле for при формировании элементов массива.
Задача Array 2. Дан ряд из 10 произвольных чисел: a[1], a[2], … , a[10] (использовать функцию random()). Подсчитать и напечатать суммы троек стоящих рядом чисел: a[1]+a[2]+a[3], a[2]+a[3]+a[4], a[3]+a[4]+a[5], …… , a[8]+a[9]+a[10]
Пример результата:
Массив = 2 0 4 29 3 11 26 11 9 4
mas[1] + mas[2] + mas[3] = 6
mas[2] + mas[3] + mas[4] = 33
mas[3] + mas[4] + mas[5] = 36
mas[4] + mas[5] + mas[6] = 43
mas[5] + mas[6] + mas[7] = 40
mas[6] + mas[7] + mas[8] = 48
mas[7] + mas[8] + mas[9] = 46
mas[8] + mas[9] + mas[10] = 24
Задача Array 3. Написать программу решения задачи о печати ряда чисел 2 4 8 16 32 … 512; для заполнения массива использовать цикл Repeat
Максимальный (минимальный) элемент массива
Псевдокод:
Поиск максимального элемента по его индексу:
Задание Array_min: Найдите минимальный элемент массива. Выведите элемент и его индекс.
Пример результата:
9 5 4 22 23 7 3 16 16 8
Минимальный элемент массива A[7]=3
Задача Array 4. Дан массив из 10 целочисленных элементов. Найти количество отрицательных и вывести количество на экран.
Пример результата:
3 4 6 -1 6 -2 1 5 0 1
Количество отрицательных элементов: 2
Задача Array 5. Найти минимальное и максимальное из n введенных чисел (массива). Определить расстояние между этими элементами.
3 2 6 1 3 4 7 2 >>> min=1, max=7, distance=3
Задача Array 6. Дан целочисленный массив размера N. Вывести все содержащиеся в данном массиве четные числа в порядке убывания их индексов, а также их количество K.
N=4
mas: 8 9 2 5
>>> 2 8 количество= 2
Задача Array 7. Ввести с клавиатуры массив из 5 элементов, найти в нем два максимальных элемента и их номера.
Пример:
Исходный массив:
4 -5 10 -10 5
максимальные A[3]=10, A[5]=5
Поиск в массиве
Рассмотрим сложный пример работы с одномерными массивами:
Пример: Дан массив из 10 чисел. Определить, есть ли в массиве число, введенное пользователем. Если есть – выводить «найдено», если нет – «не найдено».
Сложность задания заключается в том, что выводить слова «найдено» или «не найдено» необходимо один раз.
Для решения поставленной задачи понадобится оператор break — выход из цикла.
Решение Вариант 1. Цикл for:
Рассмотрим эффективное решение:
Задача: найти в массиве элемент, равный X, или установить, что его нет.
Алгоритм:
- начать с 1-го элемента (i:=1);
- если очередной элемент (A[i]) равен X, то закончить поиск иначе перейти к следующему элементу.
решение на Паскале Вариант 2. Цикл While:
Предлагаем посмотреть подробный видео разбор поиска элемента в массиве (эффективный алгоритм):
Задача Array 8. Заполнить массив из 10 элементов случайными числами в интервале [0..4] и вывести номера всех элементов, равных X.
Пример:
Исходный массив:
4 0 1 2 0 1 3 4 1 0
Что ищем? 0
A[2], A[5], A[10]
Циклический сдвиг
Пример: сдвинуть элементы массива влево на 1 позицию, первый элемент становится на место последнего.
Решение:
Алгоритм:
A[1]:=A[2]; A[2]:=A[3];… A[N-1]:=A[N];
Программа:
Задача Array 9. Заполнить массив из 10 элементов случайными числами в интервале [-10..10] и выполнить циклический сдвиг влево без первого элемента.
Пример:
Исходный массив:
4 -5 3 10 -4 -6 8 -10 1 0
Результат:
4 3 10 -4 -6 8 -10 1 0 -5
Перестановка элементов в массиве
Рассмотрим, как происходит перестановка или реверс массива.
Пример: переставить элементы массива в обратном порядке
Решение:
Алгоритм:
Псевдокод:
Программа:
Задача Array 10. Заполнить массив из 10 элементов случайными числами в интервале [-10..10] и сделать реверс всех элементов, кроме последнего.
Пример:
Исходный массив:
-5 3 10 -4 -6 8 -10 1 0 4
Результат:
0 1 -10 8 -6 -4 10 3 -5 4
Выбор элементов и сохранение в другой массив
Пример: найти в массиве элементы, удовлетворяющие некоторому условию (например, отрицательные), и скопировать их в другой массив
Решение:
Решение: подсчитывать количество найденных элементов с помощью счетчика count, очередной элемент устанавливать на место B[count]. Переменой count необходимо присвоить 1.
Вывод массива B:
for i:=1 to count-1 do
write(B[i], ‘ ‘)
Задача Array 11. Заполнить массив случайными числами в интервале [20,100] и записать в другой массив все числа, которые оканчиваются на 0.
Пример:
Исходный массив:
40 57 30 71 84
Заканчиваются на 0:
40 30
Сортировка элементов массива
Сортировка методом «Пузырька»
- В таком типе сортировок массив представляется в виде воды, маленькие элементы — пузырьки в воде, которые всплывают наверх (самые легкие).
- При первой итерации цикла элементы массива попарно сравниваются между собой:предпоследний с последним, пред предпоследний с предпоследним и т.д. Если предшествующий элемент оказывается больше последующего, то производится их обмен.
- При второй итерации цикла нет надобности сравнивать последний элемент с предпоследним. Последний элемент уже стоит на своем месте, он самый большой. Значит, число сравнений будет на одно меньше. То же самое касается каждой последующей итерации.
Выполнение на Паскале:
1 2 3 4 5 6 7 8 | for i:=1 to N-1 do begin for j:=N-1 downto i do if A[j] > A[j+1] then begin с := A[j]; A[j] := A[j+1]; A[j+1] := с; end; end; |
Задание Array 12. Заполнить массив из 10 элементов случайными числами в интервале [0..100] и отсортировать первую половину массива по возрастанию, а вторую – по убыванию (методом ‘Пузырька’).
Пример:
Исходный массив:
14 25 13 30 76 58 32 11 41 97
Результат:
13 14 25 30 76 97 58 41 32 11
Сортировка методом выбора
- в массиве ищется минимальный элемент и ставится на первое место (меняется местами с A[1]);
- среди оставшихся элементов также производится поиск минимального, который ставится на второе место (меняется местами с A[2]) и т.д.
Выполнение на Паскале:
1 2 3 4 5 6 7 8 9 10 | for i := 1 to N-1 do begin min:= i ; for j:= i+1 to N do if A[j] < A[min] then min:=j; if min <> i then begin c:=A[i]; A[i]:=A[min]; A[min]:=c; end; end; |
Задание Array 13: Заполнить массив из 10 элементов случайными числами в интервале [0..50] и отсортировать его по возрастанию суммы цифр
Пример:
Исходный массив:
14 25 13 12 76 58 21 87 10 98
Результат:
10 21 12 13 14 25 76 58 87 98
Быстрая сортировка или quick sort
Алгоритм:
- Выбирается и запоминается средний элемент массива (присвоим X):