【前端面试3+1】22 JS和TS的区别、TS接口是什么、ts中类和接口的区别、【移除元素】

一、js和ts的区别

1.类型系统

  • JavaScript:是一种动态类型语言,变量的类型是在运行时确定的,可以随时改变。
  • TypeScript:是JavaScript的一个超集,添加了静态类型,可以在编写代码时定义变量的类型,编译时会进行类型检查,减少运行时错误。

2.编译与解释

  • JavaScript:是一种解释型语言,浏览器直接执行JS代码。
  • TypeScript:需要先被编译成JavaScript才能运行,编译过程会检查类型并生成标准的JavaScript代码。

3.支持特性

  • JavaScript:具有基本的语言特性,虽然ECMAScript规范在不断更新,但JS本身不支持某些高级功能。
  • TypeScript:引入了接口、枚举、元组等特性,以及对最新JavaScript特性的支持(如async/await、类等),使代码更加模块化和可维护。

4.工具支持与IDE

  • JavaScript:虽然许多现代IDE和编辑器支持JS,但类型检查和智能提示的功能有限。
  • TypeScript:在支持的IDE中(如VSCode),能够提供更好的代码补全、重构和代码导航,因为它了解代码的类型信息。

二、TS接口是什么?

TypeScript中的接口(Interface)是一种用于定义对象结构的强类型工具。接口可以用于描述对象的形状,包括其属性和方法,允许类型检查器确保对象遵循特定的结构。这使得代码更加可读和易于维护。

三、在TypeScript中,接口和类之间有什么区别?

1. 定义和用途

  • 接口用于定义对象的结构和类型,包括属性和方法的名称及其类型。接口提供了一种协议,确保实现它的对象遵循特定的形态。它不包含任何实现细节。

  • :用于创建对象的蓝图,包括属性和方法的实现。类可以包含构造函数、访问修饰符(如 publicprivate)、静态方法等,允许创建对象的实例。

2. 实现

  • 接口接口可以被类实现(使用 implements 关键字),一个类可以实现多个接口,达到多重继承的效果。

  • 类可以继承其他类(使用 extends 关键字),该过程中可以重用父类的实现和属性。但一个类只能继承一个父类,这被称为单继承。

3. 可以包含的内容

  • 接口:只能定义属性和方法的签名,不能包含具体的实现。接口可以扩展其他接口。

  • :可以包含完整的方法实现、构造函数、字段、修饰符等。

4. 实例化

  • 接口:不能被实例化。接口只是定义的一个约束,不能用作对象的实例。

  • :可以被实例化。类可以通过 new 操作符创建对象的实例。

// 定义接口  
interface Animal {  
    name: string;  
    sound(): string;  
}  

// 实现接口的类  
class Dog implements Animal {  
    name: string;  

    constructor(name: string) {  
        this.name = name;  
    }  

    sound(): string {  
        return "Bark";  
    }  
}  

// 实例化类  
const myDog = new Dog("Buddy");  
console.log(myDog.name); // 输出:Buddy  
console.log(myDog.sound()); // 输出:Bark

在这个示例中,Animal 是一个接口,定义了 name 属性和 sound 方法。Dog 是一个实现了 Animal 接口的类,具体实现了 sound 方法。最后,我们用 new 关键字创建了 Dog 的实例。

四、【算法】移除元素

1、题目

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。

假设 nums 中不等于 val 的元素数量为 k,要通过此题,您需要执行以下操作:

  • 更改 nums 数组,使 nums 的前 k 个元素包含不等于 val 的元素。nums 的其余元素和 nums 的大小并不重要。
  • 返回 k

用户评测:

评测机将使用以下代码测试您的解决方案:

int[] nums = [...]; // 输入数组
int val = ...; // 要移除的值
int[] expectedNums = [...]; // 长度正确的预期答案。
                            // 它以不等于 val 的值排序。

int k = removeElement(nums, val); // 调用你的实现

assert k == expectedNums.length;
sort(nums, 0, k); // 排序 nums 的前 k 个元素
for (int i = 0; i < actualLength; i++) {
    assert nums[i] == expectedNums[i];
}

如果所有的断言都通过,你的解决方案将会 通过

示例 1:

输入:nums = [3,2,2,3], val = 3
输出:2, nums = [2,2,_,_]
解释:你的函数函数应该返回 k = 2, 并且 nums 中的前两个元素均为 2。
你在返回的 k 个元素之外留下了什么并不重要(因此它们并不计入评测)。

示例 2:

输入:nums = [0,1,2,2,3,0,4,2], val = 2
输出:5, nums = [0,1,4,0,3,_,_,_]
解释:你的函数应该返回 k = 5,并且 nums 中的前五个元素为 0,0,1,3,4。
注意这五个元素可以任意顺序返回。
你在返回的 k 个元素之外留下了什么并不重要(因此它们并不计入评测)。

提示:

  • 0 <= nums.length <= 100
  • 0 <= nums[i] <= 50
  • 0 <= val <= 100
int removeElement(int* nums, int numsSize, int val) {
    
}

2、题解

int removeElement(int* nums, int numsSize, int val) {  
    int k = 0; // k 记录不等于 val 的元素数量  
    for (int i = 0; i < numsSize; i++) {  
        if (nums[i] != val) { // 遇到不等于 val 的元素  
            nums[k] = nums[i]; // 将该元素移动到前面  
            k++; // 增加不等于 val 的元素计数  
        }  
    }  
    return k; // 返回不等于 val 的元素数量  
}
  1. 初始化一个计数器 k,用于记录不等于 val 的元素数量。
  2. 用 for 循环遍历输入数组 nums
  3. 当遇到不等于 val 的元素时,将该元素放到数组的前面(nums[k])。
  4. 增加计数器 k 以准备放下下一个不等于 val 的元素。
  5. 最后返回 k,即不等于 val 的元素数量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值