javascript练习题

1、给定字符串 s 和 t ,判断 s 是否为 t 的子序列

var isSubsequence = function(s, t) {
    let i = 0;
    let j = 0
    while (i < s.length && j < t.length) {
        if (s[i] === t[j]) {
            i++; 
        }
        j++; 
    }
    
    return i === s.length;
};
console.log("isSubsequence", isSubsequence("abc", "ahbgdc"))

2、反转单词前缀

var reversePrefix = function(word, ch) {
  var word = word.split("");
    let arr = []
    let str = ""
    for(i=0; i< word.length; i++){
      arr.push(word[i])
      if(word[i] === ch && word.indexOf(ch) == i){
        str =  arr.reverse("").join("")
        arr = []
      }
    }
    return str + arr.join("")
};

3、给一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。

function generateMatrix(n) {
  // 创建一个 n x n 的矩阵
  const matrix = new Array(n).fill(0).map(() => new Array(n).fill(0));
  
  let num = 1; // 当前要填充的数字
  let top = 0; // 上边界
  let bottom = n - 1; // 下边界
  let left = 0; // 左边界
  let right = n - 1; // 右边界
  
  while (num <= n * n) {
    // 从左到右填充上边界
    for (let i = left; i <= right; i++) {
      matrix[top][i] = num;
      num++;
    }
    top++;
    
    // 从上到下填充右边界
    for (let i = top; i <= bottom; i++) {
      matrix[i][right] = num;
      num++;
    }
    right--;
    
    // 从右到左填充下边界
    for (let i = right; i >= left; i--) {
      matrix[bottom][i] = num;
      num++;
    }
    bottom--;
    
    // 从下到上填充左边界
    for (let i = bottom; i >= top; i--) {
      matrix[i][left] = num;
      num++;
    }
    left++;
  }
  
  return matrix;
}

// 示例用法
const n = 3;
const matrix = generateMatrix(n);
console.log(matrix);

4、给一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。

function reverseLinkedList(pHead) {
  let prev = null;
  let current = pHead;
  
  while (current !== null) {
    let next = current.next;
    current.next = prev;
    prev = current;
    current = next;
  }
  
  return prev;
}

5、将一个节点数为 size 链表 m 位置到 n 位置之间的区间反转

class ListNode {
  constructor(val) {
    this.val = val;
    this.next = null;
  }
}

function reverseBetween(head, m, n) {
  if (!head || m === n) {
    return head;
  }

  let dummy = new ListNode(0);
  dummy.next = head;
  let prev = dummy;

  for (let i = 0; i < m - 1; i++) {
    prev = prev.next;
  }

  let start = prev.next;
  let then = start.next;

  for (let i = 0; i < n - m; i++) {
    start.next = then.next;
    then.next = prev.next;
    prev.next = then;
    then = start.next;
  }

  return dummy.next;
}

// 示例用法
const head = new ListNode(1);
head.next = new ListNode(2);
head.next.next = new ListNode(3);
head.next.next.next = new ListNode(4);
head.next.next.next.next = new ListNode(5);

const m = 2;
const n = 4;

const reversedList = reverseBetween(head, m, n);

// 打印反转后的链表
let current = reversedList;
while (current) {
  console.log(current.val);
  current = current.next;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值