Камни и украшения задача решение

Решение алгоритмов с TK. Теги с алгоритмами, Python, Computerscience, интервью.

Алгоритмы проблемы решения серии (23 части серии)

Этот пост является частью Алгоритмы проблемы решения ряд. И это было изначально опубликовано в Блог TK Отказ

Описание проблемы

Это Драгоценности и камни проблема. Описание выглядит так:

Вы даны строки J Представляя типы камней, которые являются драгоценностями, и S представляя камни, которые у вас есть. Каждый персонаж в S это тип камня, который у вас есть. Вы хотите знать, сколько у вас камней, тоже драгоценности.

Буквы в J гарантированы различными, и все персонажи в J и S буквы. Письма чувствительны к регистру, поэтому «А» считается другим типом камня от «А» Отказ

Примеры

# input: J = «aA» | S = «aAAbbbb» # output: 3 # input: J = «z», S = «ZZ» # output: 0

Решение

Сначала я пытался понять некоторые угловые случаи. Например, что я должен вернуться, если J или S это пустая строка?

Как сочетать камни с эфирными маслами. Психоэмоциональная помощь через аромадиагностику.

Как мой первый раствор, решение грубой силы, мне нужно было просмотреть строку. Поэтому мне не нужно было заботиться о пустых струнах. Для пустых строк он не циклирует, он просто возвращает счетчик по умолчанию, в этом случае 0 Отказ

Мне просто нужно было петлю через J А для каждого персонажа в J Строка, мне нужно сравнить с каждым персонажем S . Если они совпадают, я увеличиваю счетчик.

После зацикливания каждый символ просто верните конечный счетчик.

Читайте также:
Украшения из марципана виды применение

def num_jewels_in_stones(J, S): jewels = 0 for j in J: for s in S: if s == j: jewels += 1 return jewels print(num_jewels_in_stones(«aA», «aAAbbbb»)) # 3 print(num_jewels_in_stones(«z», «ZZ»)) # 0

Это O (n ^ 2) решение с точки зрения сложности времени. Или более предварительно предыдущие: O (len (j) * len (s)) . Для космической сложности это O (1) Как мы просто храним ценность в счетчике. Если Лен (j) или ЛЕН (S) Увеличение, используемое пространство постоянно постоянно.

Просто чтобы повторить это решение, мы можем сделать это O (n) С точки зрения сложности времени с помощью хэш-таблица для хранения всех символов в качестве ключа и счетчика в качестве значения.

def num_jewels_in_stones_opt(J, S): chars_counter = <> counter = 0 for char in J: if char in chars_counter: chars_counter[char] += 1 else: chars_counter[char] = 1 for char in S: if char in chars_counter: counter += chars_counter[char] return counter print(num_jewels_in_stones_opt(«aA», «aAAbbbb»)) # 3 print(num_jewels_in_stones_opt(«z», «ZZ»)) # 0

Итак, для каждого J характер. Убедитесь, что он уже в Chars_Counter Отказ Если это так, просто увеличивайте его. Если нет, инициализируйте счетчик.

Тогда для каждого S Персонаж, проверка, если этот символ находится в chars_counter. . Если это, получить его и добавьте в счетчик Переменная. Если нет, ничего не делай.

После этой итерации нам нужна окончательная стоимость счетчик Отказ Просто верните это.

Консультант. Модуль 2.13 Урок 2. Камни: виды огранок

Как мы уже говорили, он работает в O (n) Отказ Лучше первого решения. Но для наихудшего сценария космическая сложность – O (n) , хуже первого подхода.

Для получения дополнительных историй и постов о моем обучении и освоении программного обеспечения для изучения программного обеспечения, посмотрите, что Я пишу и документировал Отказ

Ресурсы

  • Обучение Python: Из грязи в князи
  • Один месяц курс Python
  • Обозначение Big-O для кодирования интервью и за пределами
  • Учите питон с нуля
  • Узнать объектно-ориентированное программирование в Python
  • Структуры данных в Python: Освещенная интервью
Читайте также:
Классные украшения для девочек

Источник: pythobyte.com

Русские Блоги

Данная строка J представляет тип драгоценного камня в камне, а строка S представляет принадлежащий вам камень. Каждый символ в S представляет собой тип камня, которым вы владеете, и вы хотите знать, сколько из имеющихся у вас камней являются драгоценными камнями.
Буквы в J не повторяются, а все символы в J и S являются буквами. Буквы чувствительны к регистру, поэтому «a» и «A» — это разные типы камней.
Пример 1:
Ввод: J = «aA», S = «aAAbbbb»
Вывод: 3
Пример 2:
Ввод: J = «z», S = «ZZ»
Вывод: 0
Примечание.
S и J могут содержать до 50 букв.
Символы в J не повторяются.
Источник: LeetCode
Ссылка: https://leetcode-cn.com/problems/jewels-and-stones
Авторские права принадлежат Lingkou Network. Для коммерческих перепечаток, пожалуйста, свяжитесь с официальным авторизатором. Для некоммерческих перепечаток укажите источник.

Источник: russianblogs.com

Python-сообщество

[RSS Feed]

  • Начало
  • » Python для новичков
  • » Задачка на камни.

#1 Авг. 9, 2019 14:43:40

Задачка на камни.

Прошу помочь додуматься как решить)
У вас есть несколько камней известного веса w1, …, wn. Напишите программу, которая распределит камни в две кучи так, что разность весов этих двух куч будет минимальной.
Исходные данные
Ввод содержит количество камней n (1 ≤ n ≤ 20) и веса камней w1, …, wn (1 ≤ wi ≤ 100 000) — целые, разделённые пробельными символами.
Результат
Ваша программа должна вывести одно число — минимальную разность весов двух куч.

def sum_list(arr): sum=0 for i in arr: sum+=i return sum qty = int(input()) stone1=[] stone2=[] L=[int(input()) for i in range(qty)] L = sorted(L) L.reverse() for i in range(len(L)): if sum_list(stone1)sum_list(stone2): stone1.append(L[i]) else: stone2.append(L[i]) print(stone1,’n’) print(stone2) sum_ = abs(sum_list(stone1)-sum_list(stone2)) print(sum_)

Пробовал с разными данными, на кучи делит правильно, но попробовал сделать с такими: 6,6,4,4,4. Делит на (6,4) и (6,4,4), а должно быть (6,6) и (4,4,4).

Читайте также:
Проект для чего нужны украшения

Отредактировано FishHook (Авг. 9, 2019 15:27:22)

#2 Авг. 9, 2019 15:46:32

Задачка на камни.

NiG
Я не проверял на большом количесве входных данных, попробуйте вот этот вариант, может быть он будет лучше

data = [1, 2, 3, 4, 5, 6, 8] data.sort() chunk1 = [] chunk2 = [] first, last = 0, len(data) — 1 while first last: small, big = data[first], data[last] if sum(chunk1) sum(chunk2): chunk1.append(small) first += 1 else: chunk2.append(big) last -= 1 print chunk1, «=», sum(chunk1) print chunk2, «=», sum(chunk2)

#3 Авг. 9, 2019 16:32:28

Задачка на камни.

Жадный поиск в таких задачахдалеко не всегда находит лучший вариант.
Ограничение на количество в 20 камней позволяет провести полный пребор всех комбинаций (при 20-ти камнях получается 1048574 итераций).

from random import randint from itertools import combinations ВСЕГО_КАМНЕЙ = 20 МАССЫ_КАМНЕЙ = [randint(1, 100000) for номер in range(ВСЕГО_КАМНЕЙ)] def поиск(массы_камней): полная_масса = sum(массы_камней) половина_массы = полная_масса/2 текущая_разница = полная_масса лучшая_комбинация = [] итерация=0 for размер_выборки in range(1, len(массы_камней)): for комбинация in combinations(массы_камней, размер_выборки): итерация += 1 if abs(половина_массы — sum(комбинация)) текущая_разница: лучшая_комбинация = комбинация текущая_разница = abs(половина_массы — sum(комбинация)) print(«Массы всех камней:», массы_камней) print(«Всего итераций:», итерация) print(«Лучшая комбинация:», лучшая_комбинация) print(«Минимальная разность:», текущая_разница*2) поиск(МАССЫ_КАМНЕЙ)
Массы всех камней: [23416, 96577, 30371, 28914, 72502, 54875, 60542, 88126, 94719, 48998, 22536, 91681, 94437, 69805, 27082, 11177, 76937, 70229, 4410, 87610]
Всего итераций: 1048574
Лучшая комбинация: (23416, 96577, 30371, 28914, 72502, 88126, 48998, 91681, 69805, 27082)
Минимальная разность: 0.0

Прикольно, что при количестве ровно в 20 камней (и, видимо, при любом достаточно большом чётном) минимальная разность при случайных массах всегда очень маленькая.

Отредактировано Striver (Авг. 9, 2019 16:37:59)

#4 Авг. 9, 2019 23:56:59

Задачка на камни.

import random col = int(input()) rock = [random.randint(1, 100000) for i in range(col)] rock.sort() rock.reverse() half_mass = int(sum(rock) / 2) part = [rock[0]] for i in rock[1:]: if sum(part + [i]) half_mass: part.append(i) #набрать 1 часть (part), все что не в ней вторая часть print(rock, part, sum(part), half_mass, half_mass — sum(part))

Читайте также:
Все идеи для украшения двора

ps в условии еще нужно обработать последнию каменюку(решить стоит ли ее добовлять в кучу, или нет, что бы было болие ровно распределена масса. но чет лень, спать хочу)
pss в общем тесты показали что эээ… вариант выше (от Striver) точнее

1. пжлст, форматируйте код, это в панели создания сообщений, выделите код и нажмите что то вроде
2. чтобы вставить изображение залейте его куда нибудь (например) , нажмите и вставьте ссылку на его url

есчщо

Отредактировано AD0DE412 (Авг. 10, 2019 12:43:12)

Источник: python.su

Рейтинг
Загрузка ...