找出数组中满足条件的所有组合!

本文介绍了一种使用二进制移位实现的算法,该算法能够找出数组中所有元素组合,使得这些组合的和等于给定的目标值。通过具体实例展示了如何通过遍历和位运算来寻找所有可能的组合。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 /**
     * 任意给一数组,如{-10,45,35,99,10,6,9,20,17,18}
     * 再任意给一个值,如35.
     * 请从上面的数组中找出所有的组合,使他们的和等于35.
     * 例如对于上面的数组,所有的组合情况为:
     * 35; -10+45;17+18;6+9+20;-10+35+10;-10+17+18+10;-10+6+9+20+10;
     * 注意,每一种组合中一个数只能出现一次。
     * 思路:利用排列组合原理 二进制移位实现
     * 0000 0000 11 表示第一位arr[0]和第二位arr[1]数相加
     *
     * @param arr
     * @param c
     */
    public static void assemble(int[] arr, int c) {
        for (int i = 1; i < 1 << arr.length; i++) { //数组集合情况  << 优先级比<大
            int temp = 0;
            StringBuffer buff = new StringBuffer();
            for (int j = 0; j < arr.length; j++) {
                if ((i & 1 << j) != 0) {  //1 << j 在数组中移动, (i & 1 << j) != 0 判断数组的集合 情况。
                    temp += arr[j];
                    buff.append(arr[j]).append(",");
                }
            }
            if (temp == c) {
                System.out.println(buff.toString().substring(0, buff.length() - 1));
            }
        }
    }

 

 

测试:

 

 public static void main(String[] arg0) {
        System.out.println(System.currentTimeMillis());
        int[] array={17,18,-10,45,35,99,10,6,9,20};
        Assemble.assemble(array,35);
        System.out.println(System.currentTimeMillis());
    }

 

结果:

1236673202015
17,18
-10,45
35
17,18,-10,10
-10,35,10
6,9,20
-10,10,6,9,20
1236673202031

 

 

思路:利用排列组合原理 二进制移位实现

 

思路来源: 一段C#代码!

转载于:https://www.cnblogs.com/ljhd/archive/2009/03/26/1422350.html

<think>我们有一个数组,需要找出数组中所有满足某个条件的元素。在ES6中,我们可以使用`filter`方法来实现这个功能。`filter`方法会创建一个新数组,其中包含所有通过测试(由提供的函数实现)的元素。 ### 使用`filter`方法 `filter`方法的基本语法如下: ```javascript let newArray = arr.filter(callback(element[, index[, array]])[, thisArg]) ``` - `callback`:用来测试每个元素的函数,返回`true`表示该元素通过测试,保留该元素;否则不保留。它可以接受三个参数: - `element`:当前正在处理的元素。 - `index`(可选):当前元素的索引。 - `array`(可选):调用了`filter`的数组本身。 - `thisArg`(可选):执行`callback`时,用于`this`的值。 ### 示例 假设我们有一个数字数组,我们想找出所有大于10的数字: ```javascript const numbers = [5, 12, 8, 130, 44]; const result = numbers.filter(number => number > 10); console.log(result); // [12, 130, 44] ``` ### 在对象数组中的应用 如果数组中的元素是对象,我们可以根据对象的属性进行筛选。例如,从一组人员中找出所有年龄大于18岁的人: ```javascript const people = [ { name: 'Alice', age: 17 }, { name: 'Bob', age: 18 }, { name: 'Charlie', age: 19 } ]; const adults = people.filter(person => person.age > 18); console.log(adults); // [ { name: 'Charlie', age: 19 } ] ``` ### 注意事项 1. `filter`不会改变原数组,而是返回一个新数组。 2. 如果没有任何元素通过测试,则返回空数组。 3. `filter`会处理数组中每一个元素,包括那些被删除或从未被赋值的元素(稀疏数组),但对于这些元素,`callback`函数不会被调用。 ### 与`find`方法的区别 用户引用的内容中提到了`find`方法,但`find`只返回第一个满足条件的元素,而`filter`返回所有满足条件的元素。 ### 复杂条件筛选 我们可以使用更复杂的条件,例如,找出数组中所有大于10且是偶数的数字: ```javascript const numbers = [5, 12, 8, 130, 44]; const result = numbers.filter(number => number > 10 && number % 2 === 0); console.log(result); // [12, 130, 44] 因为8不大于10,所以不满足 ``` ### 性能考虑 对于大型数组,使用`filter`是高效的,因为它是一个内置方法,通常由JavaScript引擎优化。但是,如果数组非常大,并且条件判断很复杂,可能需要考虑性能优化,例如使用循环并提前终止(但`filter`无法提前终止,因为需要检查所有元素)。 ### 总结 要找出数组中所有满足条件的元素,使用ES6的`filter`方法是最直接简洁的方式。 ### 相关问题 1. 如何从数组中移除满足特定条件的元素? 2. 如何检查数组中是否至少有一个元素满足条件? 3. 如何检查数组中是否所有元素都满足条件? 4. `filter`方法在哪些浏览器中支持? 5. 如何用`reduce`方法实现与`filter`相同的功能? [^1]: ES6数组方法`map`、`filter`等提供了强大的数组处理能力。 [^2]: `find`方法用于查找第一个满足条件的元素。 [^3]: 使用`find`在对象数组中查找特定元素。 [^4]: `Array.from`、`Array.of``find`方法的使用。</think>要找出数组中所有满足条件的元素,ES6 提供了多种高效的方法。以下是常用的解决方案: ### 1. 使用 `filter()` 方法(最推荐) `filter()` 会创建一个新数组,包含所有通过测试的元素: ```javascript const arr = [1, 12, 5, 8, 44]; const result = arr.filter(item => item > 10); console.log(result); // [12, 44] ``` 对于对象数组: ```javascript const users = [ { id: 1, name: "Alice", age: 25 }, { id: 2, name: "Bob", age: 17 }, { id: 3, name: "Charlie", age: 30 } ]; // 找出所有年龄大于18的用户 const adults = users.filter(user => user.age > 18); console.log(adults); // 输出: [{id:1, name:"Alice", age:25}, {id:3, name:"Charlie", age:30}] ``` ### 2. 使用 `reduce()` 方法(适合复杂操作) 当需要更复杂的过滤逻辑时: ```javascript const numbers = [10, 25, 3, 42, 7]; const result = numbers.reduce((acc, curr) => { if(curr > 20) acc.push(curr * 2); // 示例:大于20的元素加倍 return acc; }, []); console.log(result); // [50, 84] ``` ### 3. 使用 `forEach()` 循环(传统但灵活) ```javascript const fruits = ["apple", "banana", "grape", "kiwi"]; const result = []; fruits.forEach(fruit => { if(fruit.length > 5) result.push(fruit); }); console.log(result); // ["banana"] ``` ### 4. 与 `find()` 的区别(重要) - `find()`:返回**第一个**匹配元素(单个元素) ```javascript const firstAdult = users.find(user => user.age > 18); // 输出: {id:1, name:"Alice", age:25}(只返回第一个) ``` - `filter()`:返回**所有**匹配元素(数组) ### 性能提示 - 对于大型数组(>10,000 项),`for` 循环通常最快 - 使用箭头函数保持简洁:`item => item.condition` - 链式操作:`arr.filter(...).map(...)` 可组合操作 ### 复杂条件示例 ```javascript const products = [ { id: 1, name: "Laptop", price: 999, stock: 5 }, { id: 2, name: "Phone", price: 699, stock: 0 }, { id: 3, name: "Tablet", price: 400, stock: 10 } ]; // 找出价格低于700且有库存的产品 const affordableInStock = products.filter( product => product.price < 700 && product.stock > 0 ); console.log(affordableInStock); // 输出: [{id:3, name:"Tablet", price:400, stock:10}] ``` ### 浏览器兼容性 - 所有现代浏览器都支持这些方法 - 需要支持 IE11 时使用 polyfill: ```javascript // filter polyfill if (!Array.prototype.filter) { Array.prototype.filter = function(callback) { let result = []; for (let i = 0; i < this.length; i++) { if (callback(this[i], i, this)) result.push(this[i]); } return result; }; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值