【JS】 数组拆分 I #数组 Easy

给定长度为 2n 的数组, 你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), …, (an, bn) ,使得从1 到 n 的 min(ai, bi) 总和最大。

输入: [1,4,3,2] , 输出: 4
解释: n 等于 2, 最大总和为 4 = min(1, 2) + min(3, 4).

提示:
n 是正整数,范围在 [1, 10000].
数组中的元素范围在 [-10000, 10000].


解法一:

先对数组排序,然后取偶数下标的总和

原因是拆分数组时,要把最小的数与第二小的数放一块,最大的数与第二大的数放在一块,这样 min() 取值 时拿到的数就会是第二大、第四大、第六大。。。

比如 [1,3,6,10]
min([1,10])+ min([6,3])=4 , min([1,3])+ min([6,10])=7


var arrayPairSum = function(nums) {

    nums=quickSort(nums)
    var sum=0 , len=nums.length
    for(var i=0;i<len;i+=2){
        sum+=nums[i]
    }

    return sum;
};


var quickSort = function(arr){
        if(arr.length<=1) return arr;
        var pivotIndex=Math.floor(arr.length/2);
        var pivot=arr.splice(pivotIndex,1)[0];
        var left=[];
        var right=[];

        for(var i=0;i<arr.length;i++){
            if(arr[i]<=pivot){
                left.push(arr[i]);
            }
            else{
                right.push(arr[i]);
            }
        }
        return quickSort(left).concat([pivot],quickSort(right));
    }

执行用时:204 ms
已经战胜 38.66 % 的 javascript 提交记录

<think>首先,用户的问题是:“我想查找将输入的一行字符串按照空格分割数组的方法 请问将输入的一行字符串按空格分割数组的方法”。这看起来是关于如何在编程中将一个字符串分割数组,基于空格作为分隔符。 从系统指令中,我需要: - 使用中文回答。 - 结构清晰,逐步解决问题。 - 使用$...$格式的行内数学表达式,但这里可能不涉及数学,所以可能不需要。 - 独立公式用$$...$$,但同样可能不适用。 - 生相关问题。 - 在引用的段落末尾添加引用标识,如[^1]。 用户提供了三个引用: - [^1]: 关于C#中使用Split方法分割字符串,并移除空条目。 - [^2]: 关于Java中使用split方法分割字符串,处理空格时可能产生空字符串。 - [^3]: 关于C++和C中使用流或scanf来分割字符串。 这些引用是针对不同编程语言的,所以我应该覆盖这些语言,或者根据用户需求提供通用方法。 用户说:“我想查找将输入的一行字符串按照空格分割数组的方法”,没有指定语言。所以,我应该提供多种常见编程语言的实现。 在回答中,我需要结构清晰: 1. 解释通用概念。 2. 提供不同语言的示例。 3. 确保真实可靠。 最后,生相关问题。 步骤: 1. **介绍分割字符串的概念**:解释为什么需要分割,以及空格作为分隔符的常见场景。 2. **提供具体实现**: - C#:使用Split方法,如引用[^1]。 - Java:使用split方法,如引用[^2]。 - C++:使用istringstream,如引用[^3]。 - C:使用scanf或strtok。 - Python:用户可能感兴趣,但引用中没有提到。我应该添加,因为它很常见。 - JavaScript:同样,常见语言。 3. **处理空字符串**:讨论如何避免或处理分割产生的空字符串,如引用中提到的。 4. **代码示例**:使用代码块,就像在系统指令的示例中那样。 5. **添加引用标识**:在引用特定内容时添加。 6. **生相关问题**:在最后。 系统指令说:“回答中引用的段落末尾自然地添加引用标识”,所以如果我从引用中提取信息,需要添加。 用户提供的引用是: - [^1]: C# 方法 - [^2]: Java 方法 - [^3]: C/C++ 方法 在回答中,我应该参考这些。 可能的回答结构: - **引言**:解释字符串分割。 - **C# 实现**:基于引用[^1]。 - **Java 实现**:基于引用[^2]。 - **C++ 实现**:基于引用[^3]。 - **其他语言**:如Python、JavaScript。 - **总结注意事项**:如处理空字符串。 - **相关问题** 确保语言是中文。 生相关问题: - 例如:如何避免空字符串?分割字符串的其他方法?性能考虑? 最终输出: - 使用中文。 - 代码块用```language```格式。 - 添加引用标识。</think>### 将输入的一行字符串按空格分割数组的方法 在编程中,将一行字符串按空格分割数组是一种常见操作,常用于处理用户输入、文件解析或数据预处理。核心原理是使用字符串分割函数或工具,以空格作为分隔符(delimiter),将字符串拆分为多个子字符串并存储到数组中。需要注意的是,如果字符串开头、结尾或连续多个空格,可能产生空字符串元素(如 `""`),因此实际应用中需考虑如何处理这些情况(例如移除空条目)。以下是针对不同编程语言的实现方法,基于您提供的引用内容,我将逐步解释并提供代码示例。所有示例均假设输入字符串为一行文本(如 `"hello world"`),输出为分割后的数组#### 1. **C# 实现** 在 C# 中,使用 `Split` 方法是最直接的方式。引用[^1] 提到,`Split` 方法可以指定分隔符(如空格 `&#39; &#39;`),并通过 `StringSplitOptions.RemoveEmptyEntries` 参数移除空字符串元素,避免开头或结尾空格导致的无效条目。 - **步骤**: 1. 读取输入字符串(例如通过 `Console.ReadLine()`)。 2. 调用 `Split` 方法,设置分隔符为空格,并添加移除空条目的选项。 3. 将结果存储到字符串数组中。 ```csharp using System; class Program { static void Main() { Console.WriteLine("请输入一行字符串:"); string input = Console.ReadLine(); // 读取用户输入的一行字符串 // 按空格分割字符串,并移除空元素 string[] arr = input.Split(new char[] { &#39; &#39; }, StringSplitOptions.RemoveEmptyEntries); // 输出分割后的数组 Console.WriteLine("分割结果:"); foreach (string item in arr) { Console.WriteLine(item); } } } ``` - **示例输出**: 输入:`" hello world "`(开头和结尾有空格) 输出:`["hello", "world"]`(空字符串被移除) 此方法高效且简洁,适合大多数场景[^1]。 #### 2. **Java 实现** 在 Java 中,`split` 方法是标准做法。引用[^2] 指出,直接使用 `split(" ")` 可能会因开头、中间或结尾空格产生空字符串,因此建议使用正则表达式 `"\\s+"` 来匹配一个或多个连续空格,从而避免空元素。 - **步骤**: 1. 读取输入字符串(例如通过 `Scanner.nextLine()`)。 2. 调用 `split("\\s+")` 进行分割。 3. 将结果存储到字符串数组中。 ```java import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("请输入一行字符串:"); String input = scanner.nextLine(); // 读取用户输入的一行字符串 // 按一个或多个空格分割字符串 String[] arr = input.trim().split("\\s+"); // trim() 移除首尾空格 // 输出分割后的数组 System.out.println("分割结果:"); for (String item : arr) { System.out.println(item); } scanner.close(); } } ``` - **示例输出**: 输入:`" java is fun "` 输出:`["java", "is", "fun"]`(空字符串被正则表达式处理) 这种方法在 Java 中高效,但需注意正则表达式的性能影响[^2]。 #### 3. **C++ 实现** 在 C++ 中,可以使用 `std::istringstream` 和向量(`std::vector`)来分割字符串。引用[^3] 提到,通过输入流(`istringstream`)按空格自动分割,并存储到动态数组中,避免手动处理空字符串。 - **步骤**: 1. 读取输入字符串(例如通过 `std::getline`)。 2. 创建 `istringstream` 对象,循环读取每个单词。 3. 将单词存储到 `vector<string>` 中。 ```cpp #include <iostream> #include <sstream> #include <vector> #include <string> using namespace std; int main() { string input; cout << "请输入一行字符串:" << endl; getline(cin, input); // 读取一行输入 istringstream iss(input); vector<string> arr; string word; // 按空格分割字符串 while (iss >> word) { arr.push_back(word); } // 输出分割后的数组 cout << "分割结果:" << endl; for (size_t i = 0; i < arr.size(); ++i) { cout << arr[i]; if (i != arr.size() - 1) { cout << " "; // 非最后一个元素添加空格 } } cout << endl; return 0; } ``` - **示例输出**: 输入:`"c++ programming "` 输出:`["c++", "programming"]`(流自动处理连续空格) 此方法在 C++ 中高效且类型安全[^3]。 #### 4. **其他常见语言实现** 除了上述语言,以下是 Python 和 JavaScript 的简单实现(未在引用中提及,但基于通用实践): - **Python 实现**: Python 的 `split()` 方法默认按空格分割,并自动移除空字符串。 ```python input_str = input("请输入一行字符串:") # 读取用户输入 arr = input_str.split() # 按空格分割,自动处理空元素 print("分割结果:", arr) ``` 示例:输入 `" python easy "`,输出 `[&#39;python&#39;, &#39;easy&#39;]`。 - **JavaScript 实现**: 在浏览器或 Node.js 中,使用 `split` 方法配合正则表达式。 ```javascript const input = prompt("请输入一行字符串:"); // 读取输入 const arr = input.trim().split(/\s+/); // 按一个或多个空格分割 console.log("分割结果:", arr); ``` 示例:输入 `" js fast "`,输出 `["js", "fast"]`。 #### 注意事项 - **处理空字符串**:所有方法都可能因输入格式产生空元素,建议使用选项(如 C# 的 `RemoveEmptyEntries`)或预处理(如 Java 的 `trim()`)来优化。 - **性能考虑**:简单分割操作的时间复杂度一般为 $O(n)$($n$ 为字符串长度),但在高频场景中,正则表达式(如 Java)可能有额外开销。 - **适用场景**:适用于命令行工具、数据清洗或文本分析,例如解析 CSV 或日志文件。 如果您提供具体编程语言或输入样例,我可以进一步优化方案。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值