Найти значение индекса, где a появляется как подстрока в b |стриж - PullRequest
0 голосов
/ 25 февраля 2019

Я пытаюсь написать функцию, когда передано два целых числа, функция возвращает крайнюю левую позицию, когда a появляется в b, речь идет о десятичном представлении, где a появляется в b, считая от 0, поэтому 66 появляется в позиции 4 в22331166.

Таким образом, я конвертирую оба целых числа в две строки, затем проверяю, что b содержит a, однако как мне найти крайнее левое положение a, которое появляется в b?

public func solution(_ A : Int, _ B : Int) -> Int {

let a = String(A)
let b = String(B)


if b.contains(a) {


} else {
    return 0
}

return 1
}

solution(33, 88553344)

Функция должна возвращать 3, так как 88 должно быть 1, 55 - это 2, а 33 - 3.

Ответы [ 4 ]

0 голосов
/ 25 февраля 2019

Вы можете сделать это следующим образом:

public func solution(_ A : Int, _ B : Int) -> Int {

    guard A <= B, A > 0 else {
        return 0
    }

    let numberOfDigitsA = Int(log10(Double(A)) + 1)
    let tenthPowerA = Int(pow(10.0, Double(numberOfDigitsA)))
    let numberOfDigitsB = Int(log10(Double(B)) + 1)

    var b = B
    var result = 0

    while b > 0 {
        let remainder = b % tenthPowerA
        if remainder == A {
            result = numberOfDigitsB / numberOfDigitsA - result
            break
        }
        b = b / tenthPowerA
        result += 1
    }

    return result
}

В этом решении предполагается, что B состоит из групп цифр, причем каждая группа имеет то же количество цифр, что и A.0 возвращается, если B не содержит цифр A.Число позиция основано на 1.

И вот несколько тестов:

solution(55, 2233556677)    //3
solution(4, 9431)           //2
solution(123, 195000678123) //4
solution(111, 11)           //0
0 голосов
/ 25 февраля 2019

Вот как вы можете этого достичь:

public func solution(_ A : Int, _ B : Int) -> Int {

    let a = String(A)
    let b = String(B)

    if b.contains(a) {

        let range = b.range(of: "\(a.first!)")!
        return b.distance(from: b.startIndex, to: range.lowerBound) / 2 + 1

    } else {
        return 0
    }
}

solution(88, 88553344) // 1
solution(55, 88553344) // 2
solution(33, 88553344) // 3
solution(44, 88553344) // 4

И даже если вы дадите однозначное целое число

solution(3, 88553344) // 3

Примечание: это решение будет работать, только если ваш b будетпара из 2 цифр типа 88553344

0 голосов
/ 25 февраля 2019

Похоже, вы пытаетесь представить это длинное число, 88553344, как массив значений, [88, 55, 33, 44].Т.е., если вы искали 53, я предполагаю, что вы не захотите возвращать какое-либо значение.Если это так, я бы сделал это преобразование в массив, а затем произвел бы поиск:

public func solution(_ value1 : Int, _ value2 : Int) -> Int? {
    var array: [Int] = []
    var remainder = value2
    while remainder != 0 {
        array.insert(remainder % 100, at: 0)
        remainder /= 100
    }

    return array.firstIndex { $0 == value1 }
        .flatMap { $0 + 1 }
}

Или, если вы не хотите опционально и хотите представить «не найден» как, например, ноль, вы могли бы сделать:

public func solution(_ value1 : Int, _ value2 : Int) -> Int {
    var array: [Int] = []
    var remainder = value2
    while remainder != 0 {
        array.insert(remainder % 100, at: 0)
        remainder /= 100
    }

    return array.firstIndex { $0 == value1 }
        .flatMap { $0 + 1 } ?? 0
}

Обратите внимание, что использование 0 в качестве магического значения часового, как правило, не рекомендуется, но я делаю вывод из вашего индекса на основе 1, что это может быть желательным.Используйте любое значение после оператора nil коалесцирования, ??, которое вы хотите.Лично я бы придерживался опций.


Лично, поскольку мы живем в мире индексов с нулевым индексом, я бы предложил, чтобы 88 было 0, 55 должно быть1 и т. Д.: * 10101

public func solution(_ value1 : Int, _ value2 : Int) -> Int? {
    var array: [Int] = []
    var remainder = value2
    while remainder != 0 {
        array.insert(remainder % 100, at: 0)
        remainder /= 100
    }

    return array.firstIndex { $0 == value1 }
}
0 голосов
/ 25 февраля 2019

преобразовал строку b в массив символов и итеративно сравнил ее со строкой a.

  public func solution(_ A : Int, _ B : Int) -> Int {

        let a = String(A)
        let b = String(B)


        if b.contains(a) {
        let characters = Array(b)

        for i in 0..< characters.count-1{
        let cont = "\(characters[i])+\(characters[i+1])"
        if cont == a{
        print("the index is \(i)")

        return i
        } 
         return 0   
        } else {
            return 0
        }

        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...