leetcode:HappyNumber,House Robber

1.Happy Number

这个题中收获2点:

1.拿到题以后考虑特殊情况,代码中考虑1和4,或者说<6的情况,动手算下。(可能要在代码一步步测试中发现,目前还不知道怎么知道这些特殊情况)

2.数字的每一位时,n%10,n/10。(3/7的余数为3,7/3的余数为4)

  题目:

  Write an algorithm to determine if a number is "happy".

  A happy number is a number defined by the following process: Starting with any positive integer, replace the number by the sum of the squares of its digits, and repeat the process until the      number equals 1 (where it will stay), or it loops endlessly in a cycle which does not include 1. Those numbers for which this process ends in 1 are happy numbers.

  Example: 19 is a happy number

  • 12 + 92 = 82
  • 82 + 22 = 68
  • 62 + 82 = 100
  • 12 + 02 + 02 = 1

  思路:

  我的思路:(作为你个程序末末,希望大家不要嘲笑)

    将数字用pow(x,2)来计算,但是不知道怎么写,好吧,跟没有思路一样.

  Leetcode/discuss中的思路:

    (n%10)*(n%10),n/10.

    Tip:在leetcode上每道题都有个discuss,从里面可以看到大家的思路及讨论,个人觉得很不错

  代码:

    有两个我认为写的比较简洁且易懂的代码。

  代码1:

 bool isHappy(int n) {
int num=;
while(n!=&&n!=) //1为初始值,如何平方都为1。4则进入死循环
{
while(n)
{
num += (n%) * (n%); //循环将每位平方
n/=;
}
n=num;
num=;
}
return ==n;
}

代码2:

 class Solution {
public:
bool isHappy(int n) {
while(n>)
{
int next = ;
while(n)
{
next+=(n%)*(n%);
n/=;
}
n = next;
}
return n==;
}
};

代码1是将数字“1”和“4”单独拿出来看,代码2则是直接从n大于6看。其实两者是一样的,可以自己用算下,“2”和”4“是一样的,”3“,”5“,”6“最终也会进入”2“,”4“循环。

22 =4

42=8

82=16

12+62=37

32+72=58

52+82=89

82+92=145

12+42+52=42

42+22=20

22=4

32=9

92=81

82+12=65

62+52=61

62+12=37(回到22中的循环)

52=25

22+52=29

22+92=85

82+52=89(回到22中的循环)

62=36

32+62=45

42+52=41

42+12=17

12+72=50

52=25(回到52中的循环)

2.House Robber

题目收获:

  1. 如何用迭代
  2. 关于C++代码编辑器闪退的:

      1).在上述代码位置处加入语句 cin.get();

      2).同上述代码添加位置,加入语句 system("pause");

  题目:

  You are a professional robber planning to rob houses along a street. Each house has a certain amount of money stashed, the only constraint stopping you from robbing each of them is that      adjacent houses have security system connected and it will automatically contact the police if two adjacent houses were broken into on the same night.

  Given a list of non-negative integers representing the amount of money of each house, determine the maximum amount of money you can rob tonight without alerting the police.

  思路:

  我的思路:

    给定数组,求数组中不相邻的数字的最大和。但是不知道代码怎么写。

  Leetcode/discuss中的思路:

    跟我的相同,求数组中不相邻的数字的最大和。

  代码:

  贴出3段代码,前两个是写的简洁易懂的,后面一个是有问题的代码。

  代码1:C++代码

 class Solution {
public:
int rob(vector<int>& nums) {
int n = nums.size(), pre = , cur = ; //cur为i-1时的总和,pre为i-2的总和
for (int i = ; i < n; i++) {
int temp = max(pre + nums[i], cur); //如果pre+nums[i](即i-2时的总值)大于cur(即i-1时的总值),此时的总和值为pre+nums[i],否则为cur.
pre = cur;
cur = temp;
}
return cur;
}
};

  代码2:c代码,但是思路非常清楚

 int max(int a, int b) {
return a > b ? a : b;
} int rob(int* nums, int numsSize) {
int* d; d = (int*) malloc (numsSize * sizeof(nums[])); d[] = nums[];
d[] = max (nums[], nums[]); // d[i] means the most value that can be robbed before the ith store. For each store,
  // we have two choice: rob or not rob: (1)if robbing, d[i] = d[i-2] + nums[i], for stores robbed cannot be connected. (2)if not robbing, d[i] = d[i-1] for (int i = ; i < numsSize; i++) {
d[i] = max(d[i-]+nums[i], d[i-]);
} return d[numsSize-];
}

  代码3:错误思路

 #define max(a, b) ((a)>(b)?(a):(b))
int rob(int num[], int n) {
int a = ;
int b = ; for (int i=; i<n; i++)
{
if (i%==) //以奇偶来求最大,奇数和偶数必然不相邻,但却不一定是最大
{
a = max(a+num[i], b);
}
else
{
b = max(a, b+num[i]);
}
} return max(a, b);
}

  代码3的错误原因奇偶不一定就是最大,比如a = { 1, 4, 2, 2, 4, 5, 9, 5 }这数组的最大为17(只选9,4,4),奇数为16,偶数16。可知看奇偶思路是错的。

  带主函数的:不会写主函数,不过还是自己吭哧吭哧出来一个主函数的代码,还不知道测试的边界条件是什么。

 #include "stdafx.h"    //控制台头文件
#include "iostream" //cin,cout输入输出的头文件
#include "vector" //vector的头文件
#include "algorithm" //代码中的max()函数的头文件,min()也是这个
using namespace std; //C++必须写,还不知道为什么 class Solution
{
public:
int rob(vector<int>& nums)
{
int cur = ;
int pre = ;
int temp = ; for (size_t i = ; i < nums.size(); i++) //在visul studio中必须写错size_t不然会报错,但是leetcode上的测试不用,直接写成int就可以
{
temp = max(pre + nums[i], cur);
pre = cur;
cur = temp;
}
return cur;
}
}; int _tmain(int argc, _TCHAR* argv[])
{
vector<int> a = { , , , , , , , }; //测试的,本来想写成不固定的数组,数组由输入来的,暂时还不会
int m;
Solution solution; //貌似必须这么写,不能直接引用
m = solution.rob(a);
cout << "the money is " << m << endl;
cin.get(); //防止编辑器闪退
return ;
}

程序运行中出现一个错误:expected initializer before '<' token 

  错误原因是:第16行中的 for循环内分号“;”误写成了“,”。

2016.5.14——leetcode-HappyNumber,House Robber的更多相关文章

  1. 2016.09.14,英语,《Using English at Work》全书笔记

    半个月时间,听完了ESLPod出品的<Using English at Work>,笔记和自己听的时候的备注列在下面.准备把每个语音里的快速阅读部分截取出来,放在手机里反复听. 下一阶段把 ...

  2. Leetcode 337. House Robber III

    337. House Robber III Total Accepted: 18475 Total Submissions: 47725 Difficulty: Medium The thief ha ...

  3. 【算法题 14 LeetCode 147 链表的插入排序】

    算法题 14 LeetCode 147 链表的插入排序: 解题代码: # Definition for singly-linked list. # class ListNode(object): # ...

  4. Murano Weekly Meeting 2016.06.14

    Meeting time: 2016.June.14 1:00~2:00 Chairperson:  Kirill Zaitsev, from Mirantis Meeting summary: 1. ...

  5. [LeetCode] 213. House Robber II 打家劫舍 II

    Note: This is an extension of House Robber. After robbing those houses on that street, the thief has ...

  6. [LeetCode] 337. House Robber III 打家劫舍 III

    The thief has found himself a new place for his thievery again. There is only one entrance to this a ...

  7. leetcode:House Robber(动态规划dp1)

    You are a professional robber planning to rob houses along a street. Each house has a certain amount ...

  8. 2016.5.15——leetcode:Number of 1 Bits ,

    leetcode:Number of 1 Bits 代码均测试通过! 1.Number of 1 Bits 本题收获: 1.Hamming weight:即二进制中1的个数 2.n &= (n ...

  9. [LeetCode] 337. House Robber III 打家劫舍之三

    The thief has found himself a new place for his thievery again. There is only one entrance to this a ...

随机推荐

  1. matlab中 assert(any(mask(:)));

    首先,matlab中any函数:检测矩阵mask中是否有非零元素,如果有,返回1,:如果没有非零元素,即所有元素都是0,那么则返回0. assert()是一个调试程序时经常使用的宏,在程序运行时它计算 ...

  2. 【大数据】Kafka学习笔记

    第1章 Kafka概述 1.1 消息队列 (1)点对点模式(一对一,消费者主动拉取数据,消息收到后消息清除) 点对点模型通常是一个基于拉取或者轮询的消息传送模型,这种模型从队列中请求信息,而不是将消息 ...

  3. P3919 【模板】可持久化数组(可持久化线段树/平衡树)

    题目描述 如题,你需要维护这样的一个长度为 N  的数组,支持如下几种操作 在某个历史版本上修改某一个位置上的值 访问某个历史版本上的某一位置的值 此外,每进行一次操作(对于操作2,即为生成一个完全一 ...

  4. mysql查看表中列信息

    查看所有数据库中所有表的数据库名和表名 SELECT `TABLES`.`TABLE_SCHEMA`, `TABLES`.`TABLE_NAME` FROM `information_schema`. ...

  5. Python画统计图

    https://blog.csdn.net/jenyzhang/article/details/52046372

  6. [AT697]フィボナッチ

    题目大意:给你$n,k(n\leqslant10^9,k\leqslant10^3)$,求$f_n$.$f$数组满足$f_1=f_2=\cdots=f_k=1$,$f_n=\sum\limits_{i ...

  7. 【转】每个 Linux 新手都应该知道的 10 个命令

    你可能认为你是 Linux 新手,但实际上并不是.全球互联网用户有 3.74 亿,他们都以某种方式使用 Linux,因为 Linux 服务器占据了互联网的 90%.大多数现代路由器运行 Linux 或 ...

  8. 【THUSC2017】杜老师

    题目描述 杜老师可是要打+∞年World Final的男人,虽然规则不允许,但是可以改啊! 但是今年WF跟THUSC的时间这么近,所以他造了一个idea就扔下不管了…… 给定L,R,求从L到R的这R− ...

  9. SenseTime Ace Coder Challenge 暨 商汤在线编程挑战赛 A. 地铁站

    //其实比赛的时候就想到这方法了,但看到数据太吓人,就没写//看着标程,实际上就是这方法,太坑爹…… /* 假设值为k,对于图中任意两点,圆1半径k/t1,圆2半径k/t2 圆1与圆2的交集为可以设置 ...

  10. BP神经网络人口预测程序(matlab实现)

    自己测试人口预测的matlab实现: x=[54167    55196    56300    57482    58796    60266    61465    62828    64653  ...