CFSDN nhấn mạnh vào giá trị tạo ra nguồn mở và chúng tôi cam kết xây dựng nền tảng chia sẻ tài nguyên để mọi nhân viên CNTT có thể tìm thấy thế giới tuyệt vời của bạn tại đây.
Bài viết trên blog CFSDN C++ này tìm tổng của hai số và trả về chỉ số dưới. Lời giải chi tiết được tác giả sưu tầm và biên soạn. Nếu các bạn quan tâm đến bài viết này thì nhớ like nhé.
Mục lục
- Cho một mảng số nguyên và một mục tiêu giá trị đích là số nguyên, vui lòng tìm hai số nguyên trong mảng có tổng là mục tiêu giá trị đích và trả về chỉ số mảng của chúng.
- Chế độ ACM
- mẫu mã lõi
- Phương pháp một:
- tạo vectơ
- Thêm phần tử
- Xóa phần tử
- khác
- Phương pháp hai:
- Sử dụng ô tô
- bản đồ không có thứ tự
- Tìm xem phần tử có tồn tại không
- loại
- Tóm tắt:
Cho một mảng số nguyên và một mục tiêu giá trị đích là số nguyên, vui lòng tìm hai số nguyên trong mảng có tổng là mục tiêu giá trị đích và trả về chỉ số mảng của chúng.
Bạn có thể giả định rằng mỗi đầu vào sẽ chỉ tương ứng với một câu trả lời. Tuy nhiên, phần tử giống nhau trong mảng không thể xuất hiện lặp lại trong câu trả lời.
Bạn có thể trả lời câu trả lời theo thứ tự bất kỳ.
Ví dụ:
Đầu vào: nums = [2,7,11,15], target = 9.
Đầu ra: [0,1].
Giải thích: Vì nums[0] + nums[1] == 9 nên [0, 1] được trả về.
Chế độ ACM
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
#include
#include
#include
sử dụng
không gian tên
tiêu chuẩn;
số nguyên
chủ yếu(){
vectơ<
số nguyên
> số{ 2, 7, 11, 13 };
vectơ<
số nguyên
> điều;
số nguyên
mục tiêu = 18;
bản đồ không có thứ tự<
số nguyên
,
số nguyên
> ump;
vì
(
số nguyên
i = 0; i < số.kích thước(); ++i){
tự động nó = ump.find(mục tiêu - nums[i]);
nếu như
(nó != ump.end()){
vec.push_back(nó->giây);
vec.push_back(i);
}
ump[số[i]] = i;
}
vì
(
số nguyên
i = 0; i < vec.size(); ++i){
cout << vec[i] << endl;
}
}
|
mẫu mã lõi
Phương pháp một:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
lớp học
Giải pháp
{
công cộng
:
vectơ<
số nguyên
> HaiTổng(vector<
số nguyên
>&số,
số nguyên
mục tiêu)
{
số nguyên
n = số lượng.kích thước;
vì
(
số nguyên
tôi = 0; tôi < n - 1; ++i)
{
vì
(
số nguyên
j = i + 1; j < n; ++j)
{
nếu như
(nums[i] + nums[j] == mục tiêu)
trở lại
{tôi, j};
}
}
trở lại
{};
}
};
|
Để sử dụng vector, bạn cần thêm tệp tiêu đề.
?
1
2
|
#include
sử dụng
không gian tên
tiêu chuẩn;
|
tạo vectơ
?
1
2
3
4
|
vectơ<
số nguyên
> số;
vectơ<
số nguyên
> số(n);
vectơ<
số nguyên
> số(10,1);
|
Thêm phần tử
Thêm trực tiếp từ cuối mảng:
Gán trực tiếp giá trị cho vị trí thứ i:
Xóa phần tử
Trực tiếp giảm độ dài của mảng, bằng cách nào đó xóa i cuối cùng:
?
1
|
nums.resize(nums.size-i);
|
Xóa phần tử cuối cùng:
khác
?
1
2
3
|
nums.size();
sắp xếp(số.bắt đầu(), số.kết thúc());
đảo ngược(nums.begin(), nums.end());
|
?
1
2
3
4
5
|
Hợp nhất hai vectơ: hợp nhất nums1 và nums2 và gán mảng đã hợp nhất cho nums
vectơ<
số nguyên
> số1(m),số2(n);
vectơ<
số nguyên
> số;
nums.resize(m+n);
hợp nhất (số1.bắt đầu(), số1.kết thúc(), số2.bắt đầu(), số2.kết thúc(), số);
|
Phương pháp hai:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
lớp học
Giải pháp {
công cộng
:
vectơ<
số nguyên
> haiTổng(vector<
số nguyên
>& số,
số nguyên
mục tiêu) {
bản đồ không có thứ tự<
số nguyên
,
số nguyên
>bảng băm;
vì
(
số nguyên
i=0;i
tự động nó = hashtable.find(target-nums[i]);
nếu như
(nó!=hashtable.end()){
trở lại
{it->second,i};
}
bảng băm[số[i]]=i;
}
trở lại
{};
}
};
|

Sử dụng ô tô
Auto được giới thiệu trong C++ 11 có hai công dụng chính: tự động suy luận kiểu và chiếm dụng giá trị trả về.
1. Suy luận kiểu tự động.
?
1
2
3
4
5
|
lỗi tự động a;, không có biểu thức khởi tạo, không thể suy ra kiểu của a
tự động
số nguyên
a = 10; Lỗi, ngữ nghĩa của các biến tạm thời tự động không còn tồn tại trong C++ 11, đây là cách sử dụng tiêu chuẩn cũ.
xe a = 10;
xe c =
'MỘT'
;
xe ô tô
"Xin chào"
);
|
2. Trả về giá trị sử dụng.
?
1
|
auto v = soạn(2, 3.14); Kiểu của v là
gấp đôi
|
bản đồ không có thứ tự
Tệp tiêu đề của unordered_map.
Tạo vùng chứa unordered_map:
?
1
2
3
4
|
unordered_mapumap;
bản đồ không có thứ tự<
số nguyên
,
số nguyên
>umap;
|
Phương thức thành viên của vùng chứa unordered_map.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
started() //Trả về một trình lặp chuyển tiếp trỏ đến cặp khóa-giá trị đầu tiên trong vùng chứa.
end() //Trả về một trình lặp chuyển tiếp trỏ đến vị trí sau cặp khóa-giá trị cuối cùng trong vùng chứa.
find(key) //Tìm cặp khóa-giá trị với khóa là khóa. Nếu tìm thấy, hãy trả về một trình vòng lặp chuyển tiếp trỏ đến cặp khóa-giá trị; nếu không, hãy trả về một trình vòng lặp trỏ đến vị trí sau cặp khóa-giá trị cuối cùng; vùng chứa. một trình vòng lặp (nếu phương thức end() trả về một trình vòng lặp).
cbegin() vàbegin() //Các hàm đều giống nhau, ngoại trừ thuộc tính const được thêm vào chúng, nghĩa là, iterator được trả về bởi phương thức này không thể được sử dụng để sửa đổi các cặp khóa-giá trị được lưu trữ trong vùng chứa.
cend() và end() //Các hàm đều giống nhau, ngoại trừ thuộc tính const được thêm vào, nghĩa là iterator được trả về bởi phương thức này không thể được sử dụng để sửa đổi các cặp khóa-giá trị được lưu trữ trong vùng chứa.
trống () // Nếu vùng chứa trống, trả về true; nếu không thì sai.
size() //Trả về số cặp khóa-giá trị được lưu trữ trong vùng chứa hiện tại.
max_size() //Trả về số lượng cặp khóa-giá trị tối đa mà vùng chứa có thể chứa.
operator[key] //Toán tử [] bị quá tải trong lớp mẫu này. Chức năng của nó là truy cập các phần tử trong một mảng. Miễn là khóa khóa của cặp khóa-giá trị được cung cấp, giá trị tương ứng với khóa có thể là. thu được. Lưu ý rằng nếu không có cặp khóa-giá trị nào có khóa làm khóa trong vùng chứa hiện tại thì nó sẽ sử dụng khóa để chèn một cặp khóa-giá trị mới vào vùng chứa hiện tại.
at(key) //Trả về giá trị tương ứng với khóa khóa được lưu trong vùng chứa. Nếu khóa không tồn tại, một ngoại lệ out_of_range sẽ được đưa ra.
count(key) //Tìm số cặp khóa-giá trị có khóa trong vùng chứa.
bằng_range(key) //Trả về một đối tượng cặp, chứa 2 vòng lặp, được sử dụng để biểu thị phạm vi của các cặp khóa-giá trị có khóa là khóa trong vùng chứa hiện tại.
emplace() //Thêm cặp khóa-giá trị mới vào vùng chứa, hiệu quả hơn phương thức Insert().
emplace_hint() //Thêm cặp khóa-giá trị mới vào vùng chứa, hiệu quả hơn phương thức Insert().
Insert() //Thêm cặp khóa-giá trị mới vào vùng chứa.
erase() //Xóa cặp khóa-giá trị được chỉ định.
clear() //Xóa vùng chứa, nghĩa là xóa tất cả các cặp khóa-giá trị được lưu trữ trong vùng chứa.
swap() // Hoán đổi các cặp khóa-giá trị được lưu trữ trong hai vùng chứa unordered_map, với điều kiện là loại của hai vùng chứa phải hoàn toàn bằng nhau.
xô_count() //Trả về số lượng nhóm (danh sách liên kết tuyến tính đại diện cho một nhóm) được sử dụng khi lưu trữ các cặp khóa-giá trị ở cuối vùng chứa hiện tại.
max_bucket_count() //Trả về số lượng nhóm tối đa có thể được sử dụng bởi lớp dưới cùng của vùng chứa unordered_map trong hệ thống hiện tại.
xô_size(n) //Trả về số cặp khóa-giá trị được lưu trữ trong nhóm thứ n.
xô(key) //Trả về số nhóm nơi đặt cặp khóa-giá trị với khóa làm khóa.
Load_factor() //Trả về hệ số tải hiện tại trong vùng chứa unordered_map. Hệ số tải đề cập đến tỷ lệ giữa số cặp khóa-giá trị được lưu trữ trong vùng chứa hiện tại (size()) với số lượng nhóm được sử dụng (bucket_count()), nghĩa là Load_factor() = size() / Bucket_count() .
max_load_factor() //Trả về hoặc đặt hệ số tải của vùng chứa unordered_map hiện tại.
rehash(n) //Đặt số lượng nhóm được sử dụng bởi lớp dưới cùng của vùng chứa hiện tại thành n.
dự trữ() //Đặt số lượng nhóm (nghĩa là giá trị trả về của phương thức Buck_count()) thành số cần thiết để chứa ít nhất các phần tử đếm (không vượt quá hệ số tải tối đa) và sắp xếp lại vùng chứa.
hash_function() //Trả về đối tượng hàm băm được vùng chứa hiện tại sử dụng.
|
Tìm xem phần tử có tồn tại không
Nếu có unordered_map mp; hãy tìm xem x có trong bản đồ không
?
1
2
|
Cách 1: Nếu có mp.find(x) != mp.end()
Cách 2: Nếu có mp.count(x) != 0
|
loại
Trong C++, khi định nghĩa một đối tượng lớp là đối tượng con trỏ, bạn cần sử dụng -> để trỏ đến các thành viên của lớp; khi định nghĩa một đối tượng chung, bạn cần sử dụng "." để trỏ đến các thành viên của lớp. Ví dụ:
?
1
2
3
4
|
lớp học
MỘT
{
công cộng
chơi();
}
|
Nếu được xác định như sau:
A *p sử dụng: p->play(); Phía bên trái là con trỏ cấu trúc.
A p sử dụng: p.paly(); Vế trái là biến cấu trúc.
Tóm tắt:
Mũi tên (->): Phía bên trái phải là con trỏ .
Dấu chấm (.): Vế trái phải là một thực thể.
Bài viết này kết thúc tại đây, tôi hy vọng nó có thể hữu ích cho bạn và tôi hy vọng bạn có thể chú ý hơn đến nội dung của tôi! .
Liên kết gốc: https://blog.csdn.net/weixin_49358890/article/details/119118567.
Cuối cùng, bài viết này về lời giải thích chi tiết của C++ về cách tìm tổng của hai số và trả về chỉ số dưới. Nếu bạn muốn biết thêm về lời giải thích chi tiết của C++ về cách tìm tổng của hai số và trả về chỉ số dưới, vui lòng tìm kiếm bài viết CFSDN hoặc. tiếp tục duyệt các bài viết liên quan, tôi hy vọng bạn sẽ ủng hộ blog của tôi trong tương lai! .
Tôi là một lập trình viên xuất sắc, rất giỏi!