iOS - 算法

简介: iOS - 算法

1. 给出一个整形数组和一个目标值,判断数组中是否有两个数之和等于目标值


// Swift
    func twoSum(nums:[Int], target: Int) -> Bool {
        // 初始化集合
        var set = Set<Int>()
        // 遍历整形数组
        for num in nums {
            // 判断集合中是否包含目标值减去当前值的结果
            if set.contains(target - num) {
                return true
            }
            // 不包含,将当前值存入集合,用于下次判断
            set.insert(num)
        }
        //都不包含,返回false
        return false
    }
// OC
- (BOOL)twoSum:(NSArray *)array target:(int)target {
    NSMutableSet *set = [[NSMutableSet alloc] init];
    for (NSNumber *number in array) {
        if ([set containsObject:[NSNumber numberWithInt:target - [number intValue]]]) {
            return true;
        }
        [set addObject:number];
    }
    return false;
}


2. 在这道题的基础上做修改:给定一个整型数组中有且仅有 两个数之和等于目标值,求这两个数在数组中的序号.


func twoSum1(nums:[Int], target: Int) -> [Int] {
        //初始化字典
        var dict:[Int:Int] = [:]
        for (index, num) in nums.enumerated() {
            //从dict字典中取出之前保存的索引,判断索引是否存在
            if let lastIndex = dict[target - num]  {
                //返回之前存的索引和当前的索引
                return [lastIndex, index];
            } else {
                //保存当前索引,用于后续判断
                dict[num] = index
            }
        }
        fatalError("No valid output !")
    }
- (NSMutableArray *)twoSum:(NSArray *)array target:(int)target {
    NSMutableArray *idxArray = [NSMutableArray array];
    NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
    for (int i = 0; i < array.count; i ++) {
        int num = [array[i] intValue];
        NSString *lastNumber = [NSString stringWithFormat:@"%d", target - num];
        if ([dict.allKeys containsObject:lastNumber]) {
            [idxArray addObject:dict[lastNumber]];
            [idxArray addObject:[NSNumber numberWithInt:i]];
        } else {
            NSString *key = [NSString stringWithFormat:@"%d", num];
            [dict setValue:[NSNumber numberWithInt:i] forKey: key];
        }
    }
    return idxArray;
}


3. 给出一个字符串,要求将其按照单词顺序进行反转


eg: 输入 "hello world" ,输出"world hello"

//按照单词翻转字符串 hello world -> world hello
    func reversalStringWithWords(inputString: String?) -> String? {
        guard let inputString = inputString else { return nil }
        let array = inputString.components(separatedBy: " ")
        var resultArray:[String] = []
        for obj in array {
            resultArray.insert(obj, at: 0)
        }
        return (resultArray as NSArray).componentsJoined(by: " ")
    }


4. 字符串反转 hello world -> dlrow olleh


func reversalString(inputString: String?) -> String? {
        guard let inputString = inputString else { return nil }
        var outputString = ""
        for (_, str) in inputString.enumerated() {
            outputString.insert(str, at: outputString.startIndex)
        }
        return outputString
    }


5.  快速排序


func quickSort(_ array: [Int]) -> [Int] {
        guard array.count > 1 else { return array }
        let temp = array[array.count / 2 ]
        let left = array.filter{$0 < temp}
        let middle = array.filter{$0 == temp}
        let right = array.filter{$0 > temp}
        return quickSort(left) + middle + quickSort(right)
    }
    func quickSort1(_ array: [Int]) -> [Int] {
        guard array.count > 1 else { return array }
        let temp = array[array.count/2]
        var left: [Int] = [], middle: [Int] = [], right: [Int] = []
        for obj in array {
            if obj < temp {
                left.append(obj)
            } else if obj == temp {
                middle.append(obj)
            } else {
                right.append(obj)
            }
        }
        if left.count == 0 && right.count == 0 {
            return quickSort1(left) + middle + quickSort1(right)
        } else {
            return quickSort1(left) + quickSort1(middle) + quickSort1(right)
        }
    }


5.    // 二分法查找有序数组中是否包含数字x, [1, 2, 3, 4, 6, 8, 9] 4 -> true

func binarySearch(_ nums: [Int], target: Int) -> Bool {
        var left = 0, middle = 0, right = nums.count - 1
        while left <= right {
            middle = (right - left) / 2 + left
            if nums[middle] == target {
                return true
            } else if nums[middle] < target {
                left = middle + 1
            } else {
                right = middle - 1
            }
        }
        return false
    }


6.  链表


链表是一串在存储空间上非连续性、顺序的存储结构,由节点进行头尾依次连接而形成链表,每个节点又包括两个部分:数据域和下个节点的指针域


Swift里实现一个链表


  1. 生成节点

class ListNode {
    //数据域
    var val: Int
    //指针域
    var next:ListNode?
    init(_ val: Int) {
        self.val = val
        self.next = nil
    }
}


  1. 实现头插法和尾插法


  • 头插法:当前节点插到第一个节点之前


  • 尾插法:当前节点插入到链表最后一个节点之后


···

···taapht

相关文章
|
算法 数据安全/隐私保护 iOS开发
IOS加密 AES 256算法(EncryptAndDecrypt.h)
IOS加密 AES 256算法(EncryptAndDecrypt.h)
300 0
|
算法 安全 JavaScript
IOS 某电商App签名算法解析(二) Frida RPC调用
IOS 某电商App签名算法解析(二) Frida RPC调用
IOS 某电商App签名算法解析(二) Frida RPC调用
|
算法 安全 网络安全
IOS 某电商App签名算法解析(一) 还是套路
IOS 某电商App签名算法解析(一) 还是套路
IOS 某电商App签名算法解析(一) 还是套路
|
算法 数据安全/隐私保护 iOS开发
iOS逆向 08:对称算法(下)
iOS逆向 08:对称算法(下)
181 0
iOS逆向 08:对称算法(下)
|
算法 安全 大数据
iOS逆向 08:对称算法(上)
iOS逆向 08:对称算法(上)
171 0
iOS逆向 08:对称算法(上)
|
存储 算法 安全
iOS逆向 07:Hash算法
iOS逆向 07:Hash算法
322 0
iOS逆向 07:Hash算法
|
存储 机器学习/深度学习 缓存
iOS - 链表、数组区别及常见算法
iOS - 链表、数组区别及常见算法
|
算法 开发工具 git
iOS简易蓝牙对战五子棋游戏设计思路之二——核心棋盘逻辑与胜负判定算法(二)
iOS简易蓝牙对战五子棋游戏设计思路之二——核心棋盘逻辑与胜负判定算法
194 0
iOS简易蓝牙对战五子棋游戏设计思路之二——核心棋盘逻辑与胜负判定算法(二)
|
算法 iOS开发
iOS简易蓝牙对战五子棋游戏设计思路之二——核心棋盘逻辑与胜负判定算法(一)
iOS简易蓝牙对战五子棋游戏设计思路之二——核心棋盘逻辑与胜负判定算法
193 0
|
算法 安全 Java
【信息安全_其他】JAVA(Android),PHP,IOS三平台RSA加解密互通算法
【信息安全_其他_】JAVA(Android),PHP,IOS三平台RSA加解密互通算法
1112 0