Skip to content

字符串比较

ts
/**
 * 比较两个字符串的大小
 * 两个字符串都是用-连接的数字,比如 1-2-33-41-5
 * 比较方式是从左到右,依次比较每个数字的大小,遇到相等的数字继续往后比较,遇到不同的数字直接得到比较结果
 * s1 > s2 return 1
 * s1 < s2 return -1
 * s1 === s2 return 0
 */

function compare(s1: string, s2: string) {}

惯性思维

将字符串按 “-” 进行 split,然后循环进行依次比较

截取有效率问题,万一字符串长度为 1 万呢?

代码略

迭代器

点击展开
ts
/**
 * 生成器函数,生成一个迭代器
 * @param str
 */
function* walk(str: string) {
  let s = "";
  for (let c of str) {
    if (c === "-") {
      yield Number(s);
      s = "";
    } else {
      s += c;
    }
  }
  if (s) {
    yield Number(s);
  }
}

function compare(s1: string, s2: string) {
  const iter1 = walk(s1);
  const iter2 = walk(s2);

  while (true) {
    const v1 = iter1.next();
    const v2 = iter2.next();

    // 两个都结束了,就相等
    if (v1.done && v2.done) {
      return 0;
    }

    // v1 先结束,s1 < s2
    if (v1.done) {
      return -1;
    }

    // v2 先结束,s1 > s2
    if (v2.done) {
      return 1;
    }

    if (v1.value > v2.value) {
      return 1;
    }

    if (v1.value < v2.value) {
      return -1;
    }
  }
}

视频讲解