将一个数组旋转 K 步

265 阅读1分钟

Obective-C

/// 将一个数组旋转 k 步
/// @param array 数组
/// @param step 步骤
- (NSArray<NSNumber *> *)parameter1:(NSArray<NSNumber *> *)array parameter2:(NSUInteger)step {
    if (step == 0) {
        NSLog(@"您相当于什么都没做哦~");
        return array;
    }
    if (step > array.count) return nil;
    // 个数相等就直接逆序排列:
    if (step == array.count) {
        return [array.reverseObjectEnumerator allObjects];
    }
    
    // 下面的情况都是 key < array.count 的情况:
    // 拿到从后面开始数的那一部分子数组:
    NSArray *afterSubArray = [array subarrayWithRange:NSMakeRange(array.count - step, step)];
    NSArray *preSubArray = [array subarrayWithRange:NSMakeRange(0, array.count - step)];
    NSMutableArray *mArray = @[].mutableCopy;
    [mArray addObjectsFromArray:afterSubArray];
    [mArray addObjectsFromArray:preSubArray];
    return mArray;
}



Swift

// 将一个数组旋转 k 步:
    func rotateArray(array: [Int] , step: Int) -> [Int]? {
        // 空数组, 不允许:
        guard !array.isEmpty else {
            print("空数组, 不允许")
            return []
        }
        
        // 步数比数组个数还大, 不允许:
        guard step <= array.count else {
            print("步数比数组个数还大, 不允许")
            return nil
        }
        
        // 步数和数组个数相等 , 完全倒置即可:
        if step == array.count {
            return array.reversed()
        }
        
        return Array(array[(array.count - step)...] + array[..<(array.count - step)])
    }