【笔试】京东2020前端笔试题
浏览 218 | 评论 0 | 字数 2975
TTQ
2022年04月27日
  • 第一题

    提取年份。给你一个字符串,按照出现顺序输出字符串中所有可能的年份,且年份要满足[1000,3999]。
    我先是循环截取字符串,转为数字后判断,符合条件的加入集合中去重,但是只过了9%。后来想想如果一串连续的数字长度大于4,那么它肯定不是年份,所以要舍弃,所以对于连续的4个数字,应当判断它的后一位是不是非数字(或结尾),满足才能进一步判断。然后我改了之后还是只过了18%。不懂。。最后看别人的题解试了半天才搞定,也不懂是哪的问题(

    let ans = [];
    let set = new Set();
    for (let i = 0; i < str.length - 3; i++) {
      const substr = str.substring(i, i + 4);
    
      if (1000 <= parseInt(substr) && parseInt(substr) <= 3999) {
        // console.log(Number.isNaN(parseInt(str[i - 1])));
        if (
          Number.isInteger(parseInt(str[i - 1])) ||
          Number.isInteger(parseInt(str[i + 4])) ||
          set.has(substr)
        ) {
          continue;
        } else {
          ans.push(substr);
          set.add(substr);
        }
      }
    }
    for (let i = 0; i < ans.length; i++) {
      if (i != ans.length - 1) console.log(ans[i] + " ");
      else console.log(ans[i]);
    }
    console.log(ans);
    let str=gets(2022);
    
    let ans = [];
    let set = new Set();
    let cnt = 0;
    for (let i = 0; i < str.length; i++) {
      if (str[i] >= "0" && str[i] <= "9") {
        if (cnt == 0 && str[i] == "0") continue;
        else cnt++;
      } else {
        if (cnt == 4) set.add(parseInt(str.substring(i - cnt, i)));
        cnt = 0;
      }
    }
    if (cnt == 4) set.add(parseInt(str.substring(str.length - cnt, str.length)));
    let isFirst = true;
    set.forEach((item) => {
      if (item <= 3999 && item >= 1000) {
        if (isFirst) {
          console.log(item);
          isFirst = false;
        } else console.log(" " + item);
      }
    });

    第二题

    给一个由大写和小写字母组成的字符串,已知默认输入为小写,输入时可以按住shift切换大小写(每输入一个字母按住shift算一次额外操作)或者按Caps切换大小写锁定,要求输出输入这串字符串所需的最小操作数。
    很明显,当遇到需要切换大小写的情况时,如果需要切换为小写(或大写)且接下来有2个及以上的小写(或大写)字母,那么明显使用Caps(额外操作1次)会比使用shift(每多一个字母额外操作1次)操作数更少。所以只需要标记当前的大小写锁定情况,在遇到需要切换大小写时操作数额外+1,且当其后一个字母仍为切换后的大小写时保留大小写锁定(使用Caps)最终输出操作数即可。但是这个JS代码依然过不了。。。完全不理解有什么问题,用完全一模一样的逻辑用C++写了一个,直接一遍过。。。太迷惑了。。。

    let ans = 0;
    let upper = false;
    for (let i = 0; i < str.length; i++) {
      ans++;
      if (upper === false) {
        if ("A" <= str[i] && str[i] <= "Z") {
          ans++;
          if (i < n - 1 && "A" <= str[i + 1] && str[i + 1] <= "Z") upper = true;
        }
      }
      if (upper === true) {
        if ("a" <= str[i] && str[i] <= "z") {
          ans++;
          if (i < n && "a" <= str[i + 1] && str[i + 1] <= "z") upper = false;
        }
      }
    }
    console.log(ans);
    int main()
    {
        int n;
        string s;
        cin >> n >> s;
        int ans = 0;
        bool upper = false;
        for (int i = 0; i < s.length(); i++)
        {
            ans++;
            if (!upper)
            {
                if ('A' <= s[i] && s[i] <= 'Z')
                {
                    ans++;
                    if ('A' <= s[i + 1] && s[i + 1] <= 'Z')
                        upper = true;
                }
            }
            if (upper)
            {
                if ('a' <= s[i] && s[i] <= 'z')
                {
                    ans++;
                    if ('a' <= s[i + 1] && s[i + 1] <= 'z')
                        upper = false;
                }
            }
        }
        cout << ans;
    }
    本文作者:TTQ
    本文链接:https://blog.ponder.fun/archives/156.html
    最后修改时间:2022-04-27 21:24:15
    本站未注明转载的文章均为原创,并采用 CC BY-NC-SA 4.0 授权协议,转载请注明来源,谢谢!
    评论
    与本文无关评论请发留言板。请不要水评论,谢谢。
    textsms
    支持 Markdown 语法
    email
    link
    评论列表
    暂无评论