在某iOS群里群主发了几个面试题,我很感兴趣,就尝试一下。
- 题目:
给定一个数组,请获取一个数组的分界点,使得该分界点两侧子数组的和相等,如果存在多个分界点,则返回第一个分界点下标,如果没有则返回-1,时间复杂度不超过O(n)。- 示例
输入:[-20,30,10,40,20]
输出: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
-
实现思路
- 将8进制数转换为10进制
- 声明一个数组,用于存储a-z字符
- 循环对转换后的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.由于精力有限,只是用简单的几个用例测试了几下,如果有什么问题,还望大家多多指点
网友评论