2016.5.14——leetcode-HappyNumber,House Robber
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
题目收获:
- 如何用迭代
- 关于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的更多相关文章
- 2016.09.14,英语,《Using English at Work》全书笔记
半个月时间,听完了ESLPod出品的<Using English at Work>,笔记和自己听的时候的备注列在下面.准备把每个语音里的快速阅读部分截取出来,放在手机里反复听. 下一阶段把 ...
- Leetcode 337. House Robber III
337. House Robber III Total Accepted: 18475 Total Submissions: 47725 Difficulty: Medium The thief ha ...
- 【算法题 14 LeetCode 147 链表的插入排序】
算法题 14 LeetCode 147 链表的插入排序: 解题代码: # Definition for singly-linked list. # class ListNode(object): # ...
- Murano Weekly Meeting 2016.06.14
Meeting time: 2016.June.14 1:00~2:00 Chairperson: Kirill Zaitsev, from Mirantis Meeting summary: 1. ...
- [LeetCode] 213. House Robber II 打家劫舍 II
Note: This is an extension of House Robber. After robbing those houses on that street, the thief has ...
- [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 ...
- leetcode:House Robber(动态规划dp1)
You are a professional robber planning to rob houses along a street. Each house has a certain amount ...
- 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 ...
- [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 ...
随机推荐
- mybatis的mapper参数传递
简单参数传递 简单参数传递是指: 传递单个基本类型参数,数字类型.String 传递多个基本类型参数 parameterType 属性可以省略: 传递单个基本类型参数 SQL语句中参数的引用名称并不 ...
- Window系统 安装TFLearn
1. 确保成功安装了tensorflow 2. 查看当前tensorflow下的库文件,判断是否已经安装了h5py,scipy:conda list 3. 若没有安装,安装h5py,scipy.我的电 ...
- C 数据类型——Day02
C 数据类型 在 C 语言中,数据类型指的是用于声明不同类型的变量或函数的一个广泛的系统.变量的类型决定了变量存储占用的空间,以及如何解释存储的位模式. C 中的类型可分为以下几种: 序号 类型与描述 ...
- P3119 [USACO15JAN]草鉴定Grass Cownoisseur
题目描述 In an effort to better manage the grazing patterns of his cows, Farmer John has installed one-w ...
- Finding LCM LightOJ - 1215 (水题)
这题和这题一样......只不过多了个数... Finding LCM LightOJ - 1215 https://www.cnblogs.com/WTSRUVF/p/9316412.html #i ...
- 【题解】CF#896 D-Nephren Runs a Cinema
容易发现这些 vip 用户并没什么用,所以考虑枚举手持50元与100元的人共有多少个.设手持50元的人 \(a\) 个,手持100元的人 \(a - k\) 个,那么一共是 \(2*a - k\) 个 ...
- 【BZOJ2024】舞会(动态规划,容斥,高精度)
[BZOJ2024]舞会(动态规划,容斥,高精度) 题面 BZOJ 洛谷 题解 这种关系显然要先排序才不会不想影响. 设\(f[i][j]\)表示前\(i\)个女生中,选了\(j\)个女生配对,并且女 ...
- 【Cf Edu #47 G】Allowed Letters
这个题大概就是每一个位置都有一个能填字符的限制(一个点集),给出已有的$n$个字符,问能填出的最小字典序的字符串. 总体思路是贪心,每一位尽量选最小的字符. 关键在于判断在某位选了一个字符后,接下来的 ...
- [POI2011]ROT-Tree Rotations
发现x的子树在后续处理中不会影响逆序对的情况(只关心有哪些值,相对位置已经不重要了) f[x]表示x为根的子树最小逆序对数 考虑左右儿子交换与否. 暴力是O(n^2)的 考虑线段树合并 左右儿子线段树 ...
- Java中JDK,JRE和JVM之间的关系
初学JAVA很容易被其中的很多概念弄的傻傻分不清楚,首先从概念上理解一下吧,JDK(Java Development Kit)简单理解就是Java开发工具包,JRE(Java Runtime Envi ...