一、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 的元素数量。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐