查找a在b | Swift中作为子字符串出现的位置的索引值

查找a在b | Swift中作为子字符串出现的位置的索引值,swift,Swift,当传递两个整数时,我试图编写一个函数。当a出现在b中时,函数返回最左边的位置,这是关于a从0开始出现在b中的十进制表示,因此66出现在22331166的位置4 所以我把两个整数转换成两个字符串,然后签入b常量a,但是我怎么才能找到b中最左边的位置a呢 public func solution(_ A : Int, _ B : Int) -> Int { let a = String(A) let b = String(B) if b.contains(a) { } else {

当传递两个整数时,我试图编写一个函数。当a出现在b中时,函数返回最左边的位置,这是关于a从0开始出现在b中的十进制表示,因此66出现在22331166的位置4

所以我把两个整数转换成两个字符串,然后签入b常量a,但是我怎么才能找到b中最左边的位置a呢

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

将字符串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
        }

        }

以下是实现此目标的方法:

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是一对像88553344这样的两位数字时才有效。看起来你试图把这个长数字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合并运算符,?之后使用所需的任意值。就我个人而言,我会选择optionals

就个人而言,由于我们生活在一个指数为零的世界,我建议88应该是0,55应该是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 }
}

你可以这样做:

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
}

如果你在寻找一个指数,88553344中的33个位置将是5而不是3你期望的结果是什么?@LeoDabus我想他的意思是88-1,55-2,33-3,44-4所以位置取决于A的长度?这个问题完全不清楚。如果A等于3怎么办?你应该**真正整理一下缩进。
solution(55, 2233556677)    //3
solution(4, 9431)           //2
solution(123, 195000678123) //4
solution(111, 11)           //0