每周一题:第一个出现的字符+交换数字(更新JS)

题目一:

在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。

示例:

s = "abaccdeff"
返回 "b"

s = ""
返回 " "

代码:

var firstUniqChar = function(s) {
    if (s == ''){
        return " ";
    }
    for (let i = 0 ; i < s.length; i++) {
        if (s.lastIndexOf(s[i]) == s.indexOf(s[i])) {
            return s[i];
        }
    }
    return " ";
};
 
通过率:
 
思路:
这道题需要我们在字符串里面找出第一个只出现一次的字母,首先我们需要考虑字符串为空的情况,将这种情况单独列出来后,再来寻找。
一开始我是想通过遍历循环来计算每个字母出现的次数,然后比较每个字母次数大小找到只出现一次字母,接着比较数组下标,最小的那个字母即为第一个只出现一次的。但在后期实现代码时发现极易混淆,时间效率也颇为低下,便放弃了这种方法,转而开始寻找有哪种方法能够比较快捷的得出结果的,后来发现了js里面的indexOf 和 lastIndexOf 函数用法,便用这个写出了代码。
  • indexOf 是查某个指定的字符串在字符串首次出现的位置(索引值)(从左往右)
  • lastIndexOf 是查某个指定的字符串在字符串最后一次出现的位置(索引值)(从右往左)
假如我们要找题目中第一个出现一次的字母,只需要判断这两种方法得出来的数组下标是否为同一个即可。

而且值得注意的是:lastIndexOf() 方法可返回一个指定的元素在数组中最后出现的位置,是从该字符串的后面向前查找,其虽然是从后往前搜索,但返回的位置是从前开始数的。

题目二:

编写一个函数,不用临时变量,直接交换numbers = [a, b]ab的值。

示例:

输入:numbers=[1,2]

输出:[2,1]

代码:

var swapNumbers = function(numbers) {
    numbers[0]=numbers[0]+numbers[1];
    numbers[1]=numbers[0]-numbers[1];
    numbers[0]=numbers[0]-numbers[1];
    return numbers;
};
 
通过率:
 
思路:
这道题初看时我很为难,不知道该怎样才能在不设置中间临时变量的情况下将数组内的两个数据进行位置交换,后来是将此题当作数学题写时突然反应过来的。既然题目不准设置新的临时变量作为中转站,那就让已存在的变量来做跳板。首先将数组中任意一个数据的值变为两数据之和,然后不断进行相互转换。相关步骤可以看我的代码基本就能明白。但并不能将这道题当作一个完全的数学题来看待,因为计算机语言和数学解题是完全不同的,但我们可以将其作为一条思路来看待。
原文地址:https://www.cnblogs.com/sayg-1207/p/13289101.html