美文网首页
两个算法的swift实现

两个算法的swift实现

作者: 木公子jio | 来源:发表于2019-02-28 16:45 被阅读0次

在某iOS群里群主发了几个面试题,我很感兴趣,就尝试一下。

  • 题目:
    给定一个数组,请获取一个数组的分界点,使得该分界点两侧子数组的和相等,如果存在多个分界点,则返回第一个分界点下标,如果没有则返回-1,时间复杂度不超过O(n)。
  • 示例
    输入:[-20,30,10,40,20]
    输出:3
  • 实现思路

  1. 求出数组元素的总和
  2. 声明一个变量,用于存储分界点之前的元素总和
  3. 遍历数组,通过计算判断是否满足分界点
func getDividingIndex(arr:[Int]) -> Int{
        if arr.count <= 2{
            return -1
        }
        var totalSum = 0
        var index = -1
        var currentSum = arr[0]
        //求出数组元素的总和
        for num in arr{
            totalSum += num
        }
        //遍历数组
        for i in 1..<arr.count{
            //计算分界点后的元素总和
            let afterIndexSum = totalSum - currentSum - arr[i]
           //判断分界点前于分界点后的元素和是否相等
            if currentSum == afterIndexSum{
                index = i
                break
            }else{
                currentSum += arr[i]
            }
        }
        return index
    }
  • 题目:
    输入一个8进制的数,转换成小写字符a到z组成的字符串,转换规则如下:a代表1,以此类推,z代表26,aa代表27,aaa表示703.
  • 示例
    输入:32
    输出:z
  • 实现思路

  1. 将8进制数转换为10进制
  2. 声明一个数组,用于存储a-z字符
  3. 循环对转换后的10进制数做模运算,并在字符数组中根据角标取出字符拼接
func otc2String(_ otc:String) -> String{
        if otc.isEmpty || otc == "0"{
            return "0"
        }
        var int10 = Int(otc,radix:8)!
        let arr = ["z","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y"]
        var resultStr = ""
        while int10 != 0 {
            let index = int10 % 26
            resultStr = arr[index].appending(resultStr)
            int10 = int10/26
            if index == 0{
                int10 -= 1
            }
        }

        return resultStr
    }

感言

第二个题目有点坑,本来以为只是简单的进制转换,直到实现的时候才发现因为没有0的存在,这个既不是26进制,也不是27进制,有点难受。反正最后弄出来了,给自己个赞(≧▽≦)/

Ps.由于精力有限,只是用简单的几个用例测试了几下,如果有什么问题,还望大家多多指点

相关文章

网友评论

      本文标题:两个算法的swift实现

      本文链接:https://www.haomeiwen.com/subject/fhoayqtx.html