面试题

2020-12-03  本文已影响0人  阳光下的叶子呵

1、如何通过UIView获取当前的UIViewController
2、说一说 iOS内存管理机制
3、运行以下代码,输出什么?为什么会出现这样的结果?


截屏2020-12-03 20.44.28.png
@interface NSObject (Test)
+ (void)run;
@end

@implementation NSObject (Test)

- (void)run {
    NSLog(@"加油");
}
@end

运行 [NSObject run];
输出:加油


截屏2020-12-03 20.46.08.png

4、运行以下代码,输出什么?为什么会出现这样的结果?

在声明Block之后、调用Block之前对局部变量进行修改,在调用Block时局部变量值是修改之前的旧值

void test(){
    int a = 10;
    void (^block)(void) = ^{
        NSLog(@"a is %d", a);
    };
    a = 20;
    block();
}
运行test();
// 调用后控制台输出"a的值为:10"

Block内访问__block修饰的局部变量
在局部变量前使用__block修饰,在声明Block之后、调用Block之前对局部变量进行修改,在调用Block时局部变量值是修改之后的新值

   __block int a = 10;
    void(^myBlock)(void) = ^{
        NSLog(@"a的值==%d",a);
    };
    a = 11;
    // 调用后控制台输出"a的值== 11"
    myBlock();

5、运行以下代码,输出什么?为什么会出现这样的结果?

// 当前是主线程
    dispatch_queue_t queue = dispatch_queue_create("testQueue", DISPATCH_QUEUE_SERIAL);// 串行队列
    // 异步
    dispatch_async(queue, ^{
        NSLog(@"test1");
        
        // 同步
        dispatch_sync(queue, ^{
            NSLog(@"test2");
        });
    });
截屏2020-12-03 21.04.02.png

【程序崩溃!!!】
输出结果:Thread 3: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
【这表明您正在后台线程上做一些工作,并以某种方式修改UI而不分配给主线程】

6、给定一个排序数组,删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。(注意要求:不使用额外的数组空间,并且在时间复杂度为O(1) 下完成)
比方说:int test[] = {1,2,2,3,3,4,4,4,5,6,6};

(思路):
采用双指针法,初始时 i=0,j=1,然后移动 j ,判断nums[i] == nums[j] ,如果 nums[i] 不等于 nums[j] 则把 nums[j] 的值赋给 i 的的下一位,然后 i 自增1(此处注意 i++ 和 ++i 的区别)。

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int i=0;
        int n = nums.size();
        if(n==0) return 0;
        for(int j=1;j<n;j++){
            if(nums[i] != nums[j]) nums[++i] = nums[j];
        }
        return i+1;
    }
};

力扣提交结果:

执行用时 : 32 ms, 在Remove Duplicates from Sorted Array的C++提交中击败了96.08% 的用户

内存消耗 : 9.8 MB, 在Remove Duplicates from Sorted Array的C++提交中击败了87.58% 的用户

(第二种方法):

public int removeDuplicates(int[] nums) {
        //创建一个空集合
        List<Integer> list = new ArrayList<Integer>();
        for (int i = 0; i < nums.length; i++) {
            //如果集合不包含数组的某个元素,就把该元素添加到集合中。集合中包含的元素则不添加
            if(!list.contains(nums[i])){
                list.add(nums[i]);
            }
        }
        int num =list.size();
        return num;
    }
上一篇下一篇

猜你喜欢

热点阅读