)
加一题目描述给定一个表示大整数的整数数组digits其中digits[i]是整数的第i位数字。这些数字按从左到右从最高位到最低位排列。这个大整数不包含任何前导0。将大整数加 1并返回结果的数字数组。#include iostream #include vector class Solution { public: std::vectorint plusOne(std::vectorint digits) { int n digits.size(); for (int i n - 1; i 0; i--) { if (digits[i] 9) { digits[i]; return digits; } digits[i] 0; } digits.insert(digits.begin(), 1); return digits; } }; int main() { int n; Solution s1; std::cin n; std::vectorint digits(n); for (int i 0; i n; i) { std::cin digits[i]; } std::cout 输入; for(int i 0; i n; i) { std::cout digits[i] ; } std::vectorint result s1.plusOne(digits); std::cout 输出; for(int i 0; i n; i) { std::cout result[i] ; } }核心思路是加一前要检查当前位是否小于9如果需要进位执行额外操作。两数之和给定一个整数数组nums和一个整数目标值target请你在该数组中找出和为目标值target的那两个整数并返回它们的数组下标。你可以假设每种输入只会对应一个答案并且你不能使用两次相同的元素。你可以按任意顺序返回答案。#include iostream #include vector #include unordered_map // 一种是两层for循环 比较差的方法 // 另一种是利用哈希表 std::vectorint twoSum(std::vectorint nums, int target) { int len nums.size(); std::unordered_mapint, int numToIndex; for (int i 0; i len; i) { int complement target - nums[i]; if (numToIndex.find(complement) ! numToIndex.end()) { return {numToIndex[complement], i}; } numToIndex[nums[i]] i; } return {}; } int main() { int len; int target; std::cout 请输入数组长度 std::endl; std::cin len; std::vectorint nums(len); std::cout 根据长度输入对应内容 std::endl; for (int i 0; i len; i) { std::cin nums[i]; } std::cout 请输入整数目标: std::endl; std::cin target; std::vectorint result twoSum(nums, target); for (int i 0;i 2; i) { std::cout result[i]; } return 0; }三数之和给你一个整数数组nums判断是否存在三元组[nums[i], nums[j], nums[k]]满足i ! j、i ! k且j ! k同时还满足nums[i] nums[j] nums[k] 0。请你返回所有和为0且不重复的三元组。注意答案中不可以包含重复的三元组。核心在于去重#include iostream #include vector #include algorithm #include unordered_map // 三指针方法 // class Solution { // public: // std::vectorstd::vectorint threeSum(std::vectorint nums) { // std::vectorstd::vectorint result; // // 个数如果小于3的话直接返回空 // if (nums.size() 3) { // return {}; // } // // 排序的可以减少不必要操作 // sort(nums.begin(), nums.end()); // // 排序后如果第一个元素就大于0那就不可能满足条件了 // if (nums[0] 0) { // return {}; // } // // 三指针先固定第一个元素 // for (int i 0; i nums.size(); i) { // int target 0 - nums[i]; // // 去重(避免重复三元组) // if (i 0 nums[i] nums[i - 1]) { // continue; // } // int left i 1; // int right nums.size() - 1; // while(left right) { // if (nums[left] nums[right] target) { // result.push_back({nums[i], nums[left], nums[right]}); // while(left right nums[left] nums[left 1]) { // left; // } // while(left right nums[right] nums[right - 1]) { // right--; // } // left; // right--; // } else if (nums[left] nums[right] target) { // right--; // } else { // left; // } // } // } // return result; // } // }; // 哈希表 class Solution { public: std::vectorstd::vectorint threeSum(std::vectorint nums) { std::vectorstd::vectorint result; if (nums.size() 3) { return {}; } // 排序 sort(nums.begin(),nums.end()); std::unordered_mapint, int map; for (int i 0; i nums.size(); i) { map[nums[i]] i; } int target; for (int i 0; i nums.size(); i) { target -nums[i]; // 去重 if (i 0 nums[i] nums[i - 1]) { continue; } for (int j i 1; j nums.size(); j) { // 去重 if (j i 1 nums[j] nums[j - 1]) { continue; } // 计算需要找的第三个元素 int need target - nums[j]; auto it map.find(need); // 如果存在第三个元素且其索引大于j if (it ! map.end()) { int t it - second; if (t j) { result.push_back({nums[i], nums[j], nums[t]}); } else { break; } } } } return result; } }; int main() { int len; Solution s1; std::cout 请输入长度 std::endl; std::cin len; std::vectorint nums(len); std::cout 输入对应长度的元素 std::endl; for (int i 0; i len; i) { std::cin nums[i]; } std::vectorstd::vectorint result s1.threeSum(nums); if(result.empty()) { std::cout [] std::endl; }else { for (const auto i : result) { std::cout [ i[0] , i[1] , i[2] ] std::endl; } } return 0; }四数之和给你一个由n个整数组成的数组nums和一个目标值target。请你找出并返回满足下述全部条件且不重复的四元组[nums[a], nums[b], nums[c], nums[d]]若两个四元组元素一一对应则认为两个四元组重复0 a, b, c, d na、b、c和d互不相同nums[a] nums[b] nums[c] nums[d] target你可以按任意顺序返回答案 。#include iostream #include vector #include algorithm class Solution { public: std::vectorstd::vectorint fourSum(std::vectorint nums, int target) { std::vectorstd::vectorint result; if (nums.size() 4) { return {}; } sort(nums.begin(), nums.end()); for (int i 0; i nums.size() - 3; i) { if (i 0 nums[i] nums[i - 1]) { continue; } for (int j i 1; j nums.size() - 2; j) { if (j i 1 nums[j] nums[j - 1]) { continue; } int left j 1; int right nums.size() - 1; while (left right) { // 四个int相加很可能超过int范围 long long sum (long long)nums[i] nums[j] nums[left] nums[right]; if (sum target) { result.push_back({nums[i], nums[j], nums[left], nums[right]}); // 跳过重复的left值 while (left right nums[left] nums[left 1]) { left; } // 跳过重复的right值 while (left right nums[right] nums[right - 1]) { right--; } left; right--; } else if (sum target) { right--; } else { left; } } } } return result; } }; int main() { int len 0; int target 0; Solution s1; std::cout 请输入长度 std::endl; std::cin len; std::vectorint nums(len); std::cout 输入对应长度的元素 std::endl; for (int i 0; i len; i) { std::cin nums[i]; } std::cout 请输入target: std::endl; std::cin target; std::vectorstd::vectorint result s1.fourSum(nums, target); if(result.empty()) { std::cout [] std::endl; }else { for (const auto i : result) { std::cout [ i[0] , i[1] , i[2] , i[3] ] std::endl; } } return 0; }移除元素给你一个数组nums和一个值val你需要原地移除所有数值等于val的元素。元素的顺序可能发生改变。然后返回nums中与val不同的元素的数量。假设nums中不等于val的元素数量为k要通过此题您需要执行以下操作更改nums数组使nums的前k个元素包含不等于val的元素。nums的其余元素和nums的大小并不重要。返回k。class Solution { public: int removeElement(std::vectorint nums, int val) { int len nums.size(); if (len 0) { return 0; } int i 0; for (int j 0; j len; j) { if (nums[j] val) { continue; } nums[i] nums[j]; } return i; } };