[LeetCode#202] Roman to Integer
2015-09-02 12:30
302 查看
Problem:
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
Analysis:
Solution:
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
Analysis:
This problem is actually very very easy! The problem has actually described the algorithm very clearly! We just need to implement it! Choice: you want to do all those operations 82 : 8^2 + 2^2 = 68 in one step or not? If it was done in one step, in one loop, we need to first get each digit and sum the square of them together. The digit operation is always hard to implement compared with other logic, we should not mix them together. Why not separte those two major operation out? Step 1: Get the digit array of a integer. private int[] get_array(int n) { String str = String.valueOf(n); int len = str.length(); int[] ret = new int[len]; for (int i = 0; i < len; i++) { int digit_weight = (int)Math.pow(10, len-i-1); ret[i] = n / digit_weight; n = n % digit_weight; } return ret; } Skill: firstly convert n into string type, then we can get the length information through the str.length(). String str = String.valueOf(n); int len = str.length(); int[] ret = new int[len]; Step 2: Sum each digit of the int array together. private int sum(int[] a) { int ret = 0; for (int i = 0; i < a.length; i++) ret += a[i] * a[i]; return ret; } Main: According to the description, the number would end up with "1" or a circular digital sequence. If the circular situation happens, we definitely not want to avoid the infinite loop. Use our old friend : HashSet, we could easily achieve that point. HashSet<Integer> hash_set = new HashSet<Integer> (); while (!hash_set.contains(n)) { hash_set.add(n); n = sum(get_array(n)); if (n == 1) return true; } return false;
Solution:
public class Solution { public boolean isHappy(int n) { if (n < 0) throw new IllegalArgumentException("The passed in n is negative!"); HashSet<Integer> hash_set = new HashSet<Integer> (); while (!hash_set.contains(n)) { hash_set.add(n); n = sum(get_array(n)); if (n == 1) return true; } return false; } private int[] get_array(int n) { String str = String.valueOf(n); int len = str.length(); int[] ret = new int[len]; for (int i = 0; i < len; i++) { int digit_weight = (int)Math.pow(10, len-i-1); ret[i] = n / digit_weight; n = n % digit_weight; } return ret; } private int sum(int[] a) { int ret = 0; for (int i = 0; i < a.length; i++) ret += a[i] * a[i]; return ret; } }
相关文章推荐
- set_difference
- Hierarchy
- PHP面向对象之方法重写
- error C2275 将此类型用作表达式非法
- JVM内存JAVA_OPTS参数说明
- php 日志调试代码
- ASIHTTPRequest使用指南---<<翻译稿>>老外的很有价值
- POJ 3984 迷宫问题(BFS or DFS)
- 一小步
- zzuli OJ 1086: ASCII码排序(多实例测试)
- linux里有关管道符的疑惑
- JVM的GC(概念与深入)
- LeetCode Remove Duplicates from Sorted List II
- JVM的GC(概念与深入)
- 微信开发验证代码
- 王石今年三提万科转型,每一次都跟机器人有关
- LeetCode Remove Duplicates from Sorted List II
- 项目中用到的git小版本号管理
- Qt事件处理(五)
- Qt事件处理(四)