Show
Tìm vị trí phần tử xuất hiện trong mảng là bài tập số 15 trong chuỗi các bài tập thực hành ngôn ngữ lập trình C/C++ do mình giới thiệu. 1.Giới thiệu bài toánTìm kiếm vị trí phần tử trong mảng là một bài toán hay và đơn giản. Đây là một trong những bài toán giúp bạn hiều được phần nào về tìm kiếm. Đề bài: Viết hàm trả về vị trí đầu tiên của số x xuất hiện trong mảng một chiều a có n phần tử. Viết hàm trả về vị trí cuối cùng của số x xuất hiện trong mảng một chiều a có n phần tử. Hai bài toán nhưng mình gộp lại thành một, vì nội dung khá liên quan đến nhau. Cùng giải quyết thôi nào! 2.Giải quyết bài toánBài tập này ở mức vận dụng cơ bản, bạn chỉ cần nắm chắc các cú pháp, cách dùng của chủng là có thể làm được. 2.1 Hàm tìm kiếm vị trí xuất hiện đầu tiên code C/C++Tìm kiếm có hai trường hợp: Vị trí xuất hiện đầu tiên và vị trí xuất hiện cuối cùng Ý tưởng: sử dụng vòng lặp duyệt mảng, gặp phần tử có giá trị bằng số x lập tức dừng vòng lặp và trả về kết quả. Ở đây mình sẽ viết hàm trả về vị trí nên dùng kiểu int. Hàm truyền vào 3 tham số là tên mảng, số phần tử của mảng và phần tử cần tìm. Code C/C++: int FindFirstX(int a[], int n, int x){ for(int i=0;i<n;i++) if(a[i]==x) return i; } Cách đặt tên hàm thì tùy ý bạn nhé. 2.2 Hàm tìm vị trí xuất hiện cuối cùng trong mảng code C/C++Hàm tìm vị trí cuối cùng xuất hiện có khác thêm một chút. Khá giống với tư tưởng tìm vị trí đầu tiên. Điểm khác biệt ở đây là cần dùng một biến để lưu vị trí. Sau khi duyệt từ đầu đến cuối mảng ta sẽ có được vị trí cuối cùng mà phần tử cần tìm xuất hiện. Xem code tham khảo sau bạn sẽ hiểu hơn: int FindLastX(int a[], int n, int x){ int vitri; for(int i=0;i<n;i++) if(a[i]==x) vitri=i; return vitri; } 2.3 Chương trình tìm kiếm vị trí phần tử C/C++Để thành chương trình hoàn thiện, bạn cần thêm một số cấu trúc mặc định của ngôn ngữ C/C++. Do làm việc với mảng nên chúng ta cũng cần thêm hàm nhập xuất mảng vào chương trình nhé! Code C và C++ không khác nhau nhiều lắm, nếu bạn đang cần tìm kiếm chương trình bằng code C thì chỉ cần sửa một chút câu lệnh in ra màn hình, nhập giá trị từ bàn phím là được. Code C++: #include<bits/stdc++.h> using namespace std; void nhap(int a[], int &n){ do{ cout<<("Nhap n: "); cin>>n; } while(n<2||n>99); for(int i=0; i<n; i++){ cout<<"a["<<i<<"]: "; cin>>a[i]; } } void xuat(int a[], int n){ for(int i=0;i<n;i++){ cout<<" "<<a[i]; } } int FindFirstX(int a[], int n, int x){ for(int i=0;i<n;i++) if(a[i]==x) return i; } int FindLastX(int a[], int n, int x){ int vitri; for(int i=0;i<n;i++) if(a[i]==x) vitri=i; return vitri; } int main(){ int a[100]; int n, x; nhap(a,n); cout<<"Nhap phan tu can tim: "; cin>>x; cout<<"Vi tri dau tien cua phan tu: "<<FindFirstX(a,n,x)<<endl; cout<<"Vi tri cuoi cung cua phan tu: "<<FindLastX(a,n,x)<<endl; return 0; } Bài viết của mình đến đây là hết, cảm ơn bạn đã quan tâm bài viết. Đừng bỏ lỡ bài tập lập trình C/C++ tiếp theo nhé! Xem tiếp bài 16: Đếm số lần xuất hiện của phần tử trong mảng Xem lại bài 14: Xóa số nguyên tố trong mảng C/C++ Tải về đề cương 67 bài tập lập trình C/C++
Chào các bạn, Trong lập trình javascript, chúng ta thường xuyên phải làm việc với array (mảng), vì vậy nếu biết cách vận dụng thành thạo các hàm xử lý mảng thì bạn sẽ code nhanh hơn và dễ dàng hơn. Bài viết sau đây mình sẽ gửi tới bạn tất cả các phương thức, thuộc tính của đối tượng Array trong Javascript, mời các bạn cùng theo dõi. Các phương thức, thuộc tính của Array trong Javascriptconcat()concat() được sử dụng khi bạn muốn gộp nhiều mảng lại với nhau, phương thức này sẽ trả về một mảng mới. Cú pháp: array1.concat(array2, array3, ..., arrayX). Trong đó array2, array3, ..., arrayX là các mảng bạn muốn gộp lại với mảng array1. var iphonePhones = ["iphone 4", "iphone 5", "iphone 6"]; var samsungPhones = ["galaxy s1", "galaxy s2", "galaxy s3", "galaxy s4"]; var nokiaPhones = ["n8", "n81", "n82"]; var phones = nokiaPhones.concat(iphonePhones, samsungPhones); // ["n8", "n81", "n82", "iphone 4", "iphone 5", "iphone 6", "galaxy s1", "galaxy s2", "galaxy s3", "galaxy s4"] copyWithin() được sử dụng khi bạn muốn trích một đoạn trong mảng và ghi đè vào một đoạn khác trong chính mảng đó. Cú pháp: array.copyWithin(target, start, end). Trong đó:
Lưu ý: copyWithin() sẽ không bao giờ làm thay đổi số lượng phần tử có trong mảng. // Copy toàn bộ mảng và ghi đè từ vị trí thứ 2 var fruits = ["Banana", "Orange", "Apple", "Mango"]; fruits.copyWithin(2); console.log(fruits) // ["Banana", "Orange", "Banana", "Orange"] // Copy các phần tử từ vị trí 2 tới vị trí 4 sau đó ghi đè từ vị trí 0 var samsungPhones = ["galaxy s1", "galaxy s2", "galaxy s3", "galaxy s4", "galaxy s5"]; samsungPhones.copyWithin(0, 2, 4); console.log(samsungPhones); // ["galaxy s3", "galaxy s4", "galaxy s3", "galaxy s4", "galaxy s5"] entries()entries() sẽ trả về một Array iterator từ mảng ban đầu, có giá trị là một cặp [key, value]. Cú pháp: array.entries(). Phương thức này không có tham số. var fruits = ["Banana", "Orange", "Apple", "Mango"]; var f = fruits.entries(); for (let pair of f) { console.log(pair); } /* Output: [0, "Banana"] [1, "Orange"] [2, "Apple"] [3, "Mango"] */ every()every() được sử dụng khi bạn muốn kiểm tra xem tất cả các phần tử trong mảng có thỏa mãn một điều kiện do bạn đặt ra hay không. Phương thức trả về true khi tất cả các phần tử đều thỏa mãn, trả về false khi một trong số các phần tử không thỏa mãn. Điều kiện bạn đặt ra được thể hiện dưới dạng một callback, callback trả về true có nghĩa là thỏa mãn, trả về false là không thỏa mãn. Cú pháp: array.every(function(currentValue, index, arr), thisValue). Trong đó:
// Kiểm tra mảng numbers có phải toàn số lẻ hay không? let numbers = [1, 2, 3, 4, 5]; let isOddArray = numbers.every(function (item) { return item % 2 != 0; }); console.log(isOddArray); // false // Kiểm tra numbers có phải mảng giảm dần hay không? let numbers = [5, 4, 3, 2, 1]; let isDescArray = numbers.every(function (item, index, arr) { if (index == 0) { return true } else { return item < arr[index - 1]; } }); console.log(isDescArray); // true fill()Phương thức fill() sẽ làm cho tất cả các phần tử trong mảng trở thành một giá trị giống nhau. Cú pháp: array.fill(value, start, end). Trong đó:
// Điền 2 phần tử cuối cùng thành "Kiwi" var fruits = ["Banana", "Orange", "Apple", "Mango"]; fruits.fill("Kiwi", 2, 4); // ["Banana", "Orange", "Kiwi", "Kiwi"] filter()filter() được sử dụng để lọc các phần tử trong mảng theo một điều kiện mà bạn đặt ra. Phương thức này sẽ trả về một mảng mới chứa các phần tử thỏa mãn điều kiện. Điều kiện bạn đặt ra được thể hiện dưới dạng một callback, callback trả về true có nghĩa là thỏa mãn, trả về false là không thỏa mãn. Cú pháp: array.filter(function(currentValue, index, arr), thisValue). Trong đó
var tasks = [ { title: 'Fix bug 1', status: 'done' }, { title: 'Fix bug 2', status: 'todo' }, { title: 'Fix bug 3', status: 'done' }, ] var doneTasks = tasks.filter(function (task) { return task.status == 'done'; }); console.log(doneTasks); /* Output: [ { title: 'Fix bug 1', status: 'done' }, { title: 'Fix bug 3', status: 'done' }, ] */ find()find() được sử dụng khi bạn muốn tìm phần tử mảng đầu tiên thỏa mãn điều kiện mà bạn đặt ra. Điều kiện bạn đặt ra được thể hiện dưới dạng một callback, callback trả về true có nghĩa là thỏa mãn, trả về false là không thỏa mãn. Cú pháp: array.find(function(currentValue, index, arr), thisValue). Trong đó
var users = [ { id: 1, name: 'Binh' }, { id: 2, name: 'Trang' }, { id: 3, name: 'Minh' }, ]; // Tìm user có id là 2 var myId = 2; var myInfo = users.find(function (user) { return user.id == myId; }); console.log(myInfo); // {id: 2, name: "Trang"} // Tìm phần tử đầu tiên trong mảng có giá trị lớn hơn 2 var numbers = [1, 2, 3, 4, 5]; var n = numbers.find(function (item) { return item > 2; }); console.log(n); // 3 findIndex()findIndex() được sử dụng khi bạn muốn tìm vị trí của phần tử mảng đầu tiên thỏa mãn điều kiện bạn đặt ra. Điều kiện bạn đặt ra được thể hiện dưới dạng một callback, callback trả về true có nghĩa là thỏa mãn, trả về false là không thỏa mãn. Phương thức trả về -1 nếu không có phần tử mảng nào thỏa mãn điều kiện. Cú pháp: array.findIndex(function(currentValue, index, arr), thisValue). Trong đó
var users = [ { id: 1, name: 'Binh' }, { id: 2, name: 'Trang' }, { id: 3, name: 'Minh' }, ]; // Tìm vị trí của user có id là 2 var myId = 2; var myIndex = users.findIndex(function (user) { return user.id == myId; }); console.log(myIndex); // 1 // Tìm vị trí của phần tử đầu tiên trong mảng có giá trị lớn hơn 2 var numbers = [1, 2, 3, 4, 5]; var n = numbers.findIndex(function (item) { return item > 2; }); console.log(n); // 2 forEach()forEach() được sử dụng khi bạn muốn duyệt các phần tử mảng. Cú pháp: array.forEach(function(currentValue, index, arr), thisValue). Trong đó
var users = [ { id: 1, name: 'Binh' }, { id: 2, name: 'Trang' }, { id: 3, name: 'Minh' }, ]; users.forEach(function (user) { console.log(user.name); }); /* Output: Binh Trang Minh */ from()from() được sử dụng khi bạn muốn tạo ra một mảng mới từ một đối tượng dạng mảng. Đối tượng dạng mảng là đối tượng có thuộc tính length và các phần tử thì được đánh vị trí (đánh index) hoặc các đối tượng khả duyệt như Map, Set Cú pháp: Array.from(object, mapFunction(currentValue, index), thisValue). Trong đó:
var myArr = Array.from("123456", function (item, index, arr) { return item * 2; }); console.log(myArr); // [2, 4, 6, 8, 10, 12] includes()includes() được sử dụng để kiểm tra một phần tử có xuất hiện trong mảng hay không. Phương thức này trả về true nếu phần tử mảng có xuất hiện, trả về false nếu phần tử mảng không xuất hiện. Cú pháp: array.includes(element, start). Trong đó
var fruits = ["Banana", "Orange", "Apple", "Mango"]; var n = fruits.includes("Mango"); // true indexOf()indexOf() được sử dụng khi bạn muốn tìm vị trí (đầu tiên) của một phần tử trong mảng. Phương thức sẽ trả về -1 nếu không tìm thấy. Cú pháp: array.indexOf(item, start). Trong đó:
var fruits = ["Banana", "Orange", "Apple", "Mango"]; var a = fruits.indexOf("Apple"); // 2 isArray()isArray() được sử dụng để kiểm tra một đối tượng có phải là array hay không. Phương thức trả về true nếu đối tượng là array, trả về false nếu không phải là array. Cú pháp: Array.isArray(obj). Trong đó obj là đối tượng bạn muốn kiểm tra. var fruits = ["Banana", "Orange", "Apple", "Mango"]; var isArray = Array.isArray(fruits); // true join()join() được sử dụng khi bạn muốn nối các phần tử của mảng thành một string. Cú pháp: array.join(separator). Trong đó separator là giá trị sẽ nằm giữa các phần tử mảng sau khi được chuyển trành string, tham số này không bắt buộc, mặc định sẽ là dấu phẩy “,”. var fruits = ["Banana", "Orange", "Apple", "Mango"]; var energy = fruits.join(); // "Banana,Orange,Apple,Mango" keys()keys() phương thức sẽ trả về một đối tượng Array Iterator với giá trị là các keys của mảng. Cú pháp: array.keys(). Phương thức này không có tham số. var fruits = ["Banana", "Orange", "Apple", "Mango"]; var fk = fruits.keys(); for (x of fk) { console.log(x); } /* Output: 0 1 2 3 */ lengthlength sẽ trả về số lượng phần tử có trong mảng, hoặc bạn có thể thay đổi số lượng phần tử trong mảng bằng cách gán giá trị mới cho thuộc tính này. var fruits = ["Banana", "Orange", "Apple", "Mango"]; console.log(fruits.length); // 4 fruits.length = 1; console.log(fruits); // ["Banana"] lastIndexOf()lastIndexOf() được sử dụng khi bạn muốn tìm kiếm vị trí cuối cùng của một phần tử trong mảng mà bạn truyền vào. Phương thức trả về -1 nếu không tìm thấy. Cú pháp: array.lastIndexOf(item, start). Trong đó:
var fruits = ["Banana", "Orange", "Apple", "Mango"]; var n = fruits.lastIndexOf("Apple"); console.log(n); // 2 map()map() được sử dụng khi bạn muốn làm thay đổi giá trị của các phần tử trong mảng theo một logic nào đó. Logic được thể hiện dưới dạng một callback, giá trị trả về của callback sẽ là giá trị mới cho phần tử mảng tương ứng. Cú pháp: array.map(function(currentValue, index, arr), thisValue). Trong đó:
var numbers = [2, 4, 6, 8]; var doubleNumbers = numbers.map(function(num) { return num * 2; }); console.log(doubleNumbers); // [4, 8, 12, 16] pop()pop() sẽ xóa phần tử cuối cùng trong mảng, đồng thời trả về phần tử vừa xóa. Cú pháp: array.pop(). Phương thức này không có tham số. var fruits = ["Banana", "Orange", "Apple", "Mango"]; var item = fruits.pop(); console.log(item); // Mango console.log(fruits); // ["Banana", "Orange", "Apple"] push()push() được sử dụng để thêm một phần tử vào cuối mảng, đồng thời trả về độ dài của mảng. Cú pháp: array.push(item1, item2, ..., itemX). Trong đó:
var fruits = ["Banana", "Orange", "Apple", "Mango"]; var length = fruits.push("Kiwi"); console.log(fruits); // ["Banana", "Orange", "Apple", "Mango", "Kiwi"] console.log(length); 5 reduce()reduce() được sử dụng khi bạn muốn thực thi một callback lên từng phần tử (từ trái qua phải) với một biến được “tích lũy” để trả về một giá trị duy nhất. Cú pháp: array.reduce(function(total, currentValue, currentIndex, arr), initialValue). Trong đó:
// Tính tổng các phần tử trong mảng numbers var numbers = [1, 2, 3, 4, 5, 6]; var sum = numbers.reduce(function (total, number) { return total + number; }, 0); console.log(sum); // 21 reduceRight()phương thức reduceRight() tương tự như reduce(), tuy nhiên reduceRight() sẽ thực thi callback lên từng phần tử theo thứ tự từ phải qua trái. Cú pháp: array.reduceRight(function(total, currentValue, currentIndex, arr), initialValue). Trong đó:
// Tính hiệu các phần tử trong mảng numbers theo chiều từ phải qua trái var numbers = [2, 45, 30, 100]; var subtract = numbers.reduce(function (total, number) { return total - number; }, 0); console.log(subtract); // -177 reverse()reverse() được sử dụng khi bạn muốn đảo ngược thứ tự các phần tử trong mảng. Tức là phần tử đầu sẽ trở thành phần tử cuối. Cú pháp: array.reverse(). Phương thức này không có tham số. var fruits = ["Banana", "Orange", "Apple", "Mango"]; fruits.reverse(); console.log(fruits); // ["Mango", "Apple", "Orange", "Banana"] shift()shift() được sử dụng khi bạn muốn xóa phần tử đầu tiên của mảng, đồng thời trả về phần tử đó. Cú pháp: array.shift(). Phương thức này không có tham số. var fruits = ["Banana", "Orange", "Apple", "Mango"]; var item = fruits.shift(); console.log(fruits); // ["Orange", "Apple", "Mango"] console.log(item); // Banana slice()slice() được sử dụng khi bạn muốn trích một mảng con từ vị trí n tới vị trí m trong mảng ban đầu. Lưu ý mảng được trích sẽ không bao gồm phần tử thứ m. Cú pháp: array.slice(start, end). Trong đó:
var fruits = ["Banana", "Orange", "Lemon", "Apple", "Mango"]; // Mảng citrus được trích từ mảng fruits, trích từ phần tử index 1, tới phần tử index 3 var citrus = fruits.slice(1, 3); console.log(citrus); // ["Orange", "Lemon"] // Trích từ cuối mảng lên var myBest = fruits.slice(-3, -1); console.log(myBest); // ["Lemon", "Apple"] some()Phương thức some() sẽ giúp bạn kiểm tra một mảng có thỏa mãn điều kiện hay không. Điều kiện được thể hiện dưới dạng một callback duyệt lần lượt các phần tử mảng, nếu kết quả callback của một trong số các phần tử mảng trả về true, thì phương thức some() trả về true, nếu callback của tất cả các phần tử mảng trả về false, phương thức some trả về false. Cú pháp: array.some(function(currentValue, index, arr), thisValue). Trong đó:
// Kiểm tra mảng numbers có số nào là số lẻ hay không? var numbers = [1, 2, 3, 4, 5]; var hasOddNumber = numbers.some(function (item) { return item % 2 != 0; }); console.log(hasOddNumber); // true sort()sort() được sử dụng khi bạn muốn sắp xếp các phần tử trong mảng theo chiều tăng dần hoặc giảm dần. Mặc định phương thức sort() sẽ sắp xếp mảng theo thứ tự bảng chữ cái theo chiều tăng dần. Trong trường hợp bạn muốn “tùy chỉnh” thứ tự sắp xếp, thì phương thức sort() cũng chấp nhận một tham số dưới dạng callback giúp bạn làm điều này. Cú pháp: array.sort(function (a, b)). Trong đó function (a, b) (không bắt buộc) là callback để bạn tùy chỉnh thứ tự sắp xếp các phần tử trong mảng. Tham số a, b là một cặp phần tử trong mảng. Callback trả về >= 0 thì a và b sẽ không đổi chỗ, trả về < 0 thì a và b sẽ đổi chỗ cho nhau. // Sắp xếp phần tử mảng theo thứ tự bảng chữ cái var fruits = ["Banana", "Orange", "Apple", "Mango"]; fruits.sort(); console.log(fruits); // ["Apple", "Banana", "Mango", "Orange"] // Sắp xếp mảng tăng dần var numbers = [5, 3, 6, 1, 2]; numbers.sort(); console.log(numbers); // [1, 2, 3, 5, 6] // Sắp xếp mảng giảm dần var numbers = [5, 3, 6, 1, 2]; numbers.sort(function (a, b) { return b - a; }); console.log(numbers); // [6, 5, 3, 2, 1] splice()splice() được sử dụng khi bạn muốn thay thế một số phần tử trong mảng bằng một số phần tử khác. Cú pháp: array.splice(index, howmany, item1, ....., itemX). Trong đó:
// Thay thế 1 phần tử tính từ index 2 bằng các phần tử "Lemon", "Kiwi" var fruits = ["Banana", "Orange", "Apple", "Mango"]; fruits.splice(2, 1, "Lemon", "Kiwi"); console.log(fruits); // ["Banana", "Orange", "Lemon", "Kiwi", "Mango"]; // Do các tham số item1,... itemX là không bắt buộc // Nên chúng ta có thể sử dụng phương thức này để xóa hàng loạt các phần tử trong mảng, xet ví dụ dưới đây // Xóa 2 phần tử mảng kể từ index 2 var fruits = ["Banana", "Orange", "Apple", "Mango"]; fruits.splice(2, 2); console.log(fruits); // ["Banana", "Orange"] toString()toString() sẽ trả về một string từ mảng ban đầu, với các phần tử mảng ngăn cách nhau bằng dấu phẩy “,”. Cú pháp: array.toString(). Phương thức này không có tham số. Nếu bạn muốn tùy chỉnh ký tự ngăn cách giữa các phần tử mảng, thì có thể tham khảo phương thức join(). var fruits = ["Banana", "Orange", "Apple", "Mango"]; var x = fruits.toString(); console.log(x); // "Banana,Orange,Apple,Mango" unshift()unshift() được sử dụng khi bạn muốn thêm một hoặc một số phần tử vào đầu mảng. Phương thức sẽ trả về số lượng phần tử trong mảng sau khi thêm. Cú pháp: array.unshift(item1, item2, ..., itemX). Trong đó item1, item2, …, itemX là các phần tử bạn muốn thêm vào đầu mảng. var fruits = ["Banana", "Orange", "Apple", "Mango"]; var length = fruits.unshift("Lemon","Pineapple"); console.log(fruits); // ["Lemon", "Pineapple", "Banana", "Orange", "Apple", "Mango"] console.log(length); // 6 valueOf()Phương thức này hơi vô nghĩa, nó sẽ trả về y hệt như mảng ban đầu. Cú pháp: array.valueOf(). Phương thức này không có tham số. var fruits = ["Banana", "Orange", "Apple", "Mango"]; var v = fruits.valueOf(); console.log(v); // ["Banana", "Orange", "Apple", "Mango"] Tổng kếtTrên là toàn bộ các phương thức (hàm) xử lý mảng trong JavaScript. Trong đó có một số phương thức tương tự nhau mà mình có thể gom nhóm lại như sau: Nhóm thêm, xóa vào đầu, cuối mảng
Nhóm check mảng:
Nhóm tìm cái gì đó trong mảng:
Tới đây là hết rồi, chúc các bạn học tập hiệu quả. |