LeetCode题目解析(C++语言版)(第13期)

论坛 期权论坛 期权     
小奥的学习笔记   2019-7-15 08:55   4642   0

(本文共1889字,0图,预计阅读时间:10分钟)
01
leetcode9: Palindrome(回文数)


[h1]题目描述[/h1]判断一个整数是否是回文数。
[h1]题目解析[/h1]我们通过观察可以看出,回文数有以下两种类型:ABA和ABBA。所以本质上它们都还是镜像对称的,所以可以想到一个结构,就是队列。我们可以把数字以中间位为对称轴拆成两部分,然后做下面这几步:
  • 按顺序将对称轴右侧的几位push到一个queue里面(比如上面中的A/BA,剩下的就是AB/AB)。
  • 然后判断这个数字的长度是奇数还是偶数,若是偶数,直接到下一步,若是奇数,操作
    1. x /=10
    复制代码
    ,也就是把对称轴删掉(这样X剩下的就是A/AB了)。
  • 然后将queue里面的数字按pop的顺序连起来,判断与原来那个数字剩下的几位是否相等,若相等就是回文数。
[h1]代码实现[/h1]
  1. bool isPalindrome(int x) {
复制代码
  1.   if (x < 0)
复制代码
  1.     return false;
复制代码
  1.   queue tmp;
复制代码
  1.   int len = 0;
复制代码
  1.   int copy = 0;
复制代码
  1.   //1.计算数字的长度
复制代码
  1.   for (int i = x; i; i /= 10)
复制代码
  1.     ++len;
复制代码
  1.   //2.按顺序将对称轴右侧的push到queue中。
复制代码
  1.   for (int j = len / 2; j > 0; --j)
复制代码
  1.   {
复制代码
  1.     tmp.push(x % 10);
复制代码
  1.     x /= 10;
复制代码
  1.   }
复制代码
  1.   //3.若是奇数,则提取出来对称轴前面的数字
复制代码
  1.   if (len % 2 == 1)
复制代码
  1.     x /= 10;
复制代码
  1.   //4.把pop出来的数字连起来
复制代码
  1.   for (int j = len / 2; j > 0; j--)
复制代码
  1.   {
复制代码
  1.     copy = copy * 10 + tmp.front();
复制代码
  1.     tmp.pop();
复制代码
  1.   }
复制代码
  1.   //5.与x剩下的部分对比
复制代码
  1.   if (copy == x)
复制代码
  1.     return true;
复制代码
  1.   else
复制代码
  1.     return false;
复制代码
  1. }
复制代码
02
Leetcode 1:Two sum


[h1]题目描述[/h1]Given an array of integers, find two numbers such that they add up to a specific target number.
The function twoSum should return indices of the two numbers such that they add up to the target, where index1 must be less than index2. Please note that your returned answers (both index1 and index2) are not zero-based.
You may assume that each input would have exactly one solution.
Input: numbers={2, 7, 11, 15}, target=9Output: index1=1, index2=2
[h1]代码解析[/h1][h1]代码实现[/h1]代码1:
  1. vector twoSum(vector &numbers, int target) {
复制代码
  1.   vectorresult;
复制代码
  1.   int nlen = numbers.size();
复制代码
  1.   if (nlen < 2)
复制代码
  1.     return result;
复制代码
  1.   vectornum;
复制代码
  1.   for (int i = 0; i < nlen; i++)
复制代码
  1.   {
复制代码
  1.     num.push_back(numbers[i]);
复制代码
  1.   }
复制代码
  1.   sort(numbers.begin(), numbers.end());
复制代码
  1.   int i = 0, j = nlen - 1,tmp1=INT_MIN,tmp2=INT_MIN;
复制代码
  1.   while (i < j)
复制代码
  1.   {
复制代码
  1.     if (numbers[i] + numbers[j] == target)
复制代码
  1.     {
复制代码
  1.       tmp1 = numbers[i];
复制代码
  1.       tmp2 = numbers[j];
复制代码
  1.       break;
复制代码
  1.     }
复制代码
  1.     else if (numbers[i] + numbers[j] < target)
复制代码
  1.       ++i;
复制代码
  1.     else if (numbers[i] + numbers[j] > target)
复制代码
  1.       --j;
复制代码
  1.   }
复制代码
  1.   for (int k = 0; k < nlen; k++)
复制代码
  1.   {
复制代码
  1.     if (num[k] == tmp1)
复制代码
  1.     {
复制代码
  1.       result.push_back(k + 1);
复制代码
  1.       continue;
复制代码
  1.     }
复制代码
  1.       
复制代码
  1.     if (num[k] == tmp2)
复制代码
  1.       result.push_back(k+1);
复制代码
  1.   }
复制代码
  1.   sort(result.begin(), result.end());
复制代码
  1.   return result;
复制代码
  1. }
复制代码
  1. [/code]代码2:
  2. [list][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][/list][code]vector twoSum(vector& nums, int target) {
复制代码
  1.     vectorres(2,-1);
复制代码
  1.     map tmp;
复制代码
[code]    for(int i=0;i
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:10
帖子:2
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP