今天的题目比较难理解。

(1)String to Integer (atoi)

解题思路:

实现atoi函数,将字符串转换成整型数。题目要求:

1. 首先需要丢弃字符串前面的空格;(trim函数)

2. 然后可能有正负号(注意只取一个,如果有多个正负号,那么说这个字符串是无法转换的,返回0。比如测试用例里就有个“+-2”);

3. 字符串可以包含0~9以外的字符,如果遇到非数字字符,那么只取该字符之前的部分,如“-00123a66”返回为“-123”;

4. 如果超出int的范围,返回边界值(2147483647或-2147483648)。

代码如下:

 1 public class Solution {
 2     public int myAtoi(String str) {
 3         // 1. null or empty string
 4         if (str == null) {
 5             return 0;
 6         }
 7
 8         // 2. whitespaces
 9         str = str.trim();
10         if (str.length() == 0) {
11             return 0;
12         }
13
14         // 3. +/- sign
15         int sign = 1;
16         int i = 0;
17         if (str.charAt(0) == ‘+‘) {
18             i++;
19         } else if (str.charAt(0) == ‘-‘) {
20             sign = -1;
21             i++;
22         }
23
24         // 4. calculate real value
25         double tmp = 0;
26         for ( ; i < str.length(); i++) {
27             int digit = str.charAt(i) - ‘0‘;
28             if (digit < 0 || digit > 9) {
29                 break;
30             }
31             // 5. handle min & max
32             if (sign == 1) {
33                 tmp = 10*tmp + digit;
34                 if (tmp > Integer.MAX_VALUE) return Integer.MAX_VALUE;
35             } else {
36                 tmp = 10*tmp - digit;
37                 if (tmp < Integer.MIN_VALUE) return Integer.MIN_VALUE;
38             }
39         }
40
41         int ret = (int)tmp;
42         return ret;
43     }
44 }

(2)Rotate Function

解题思路:

F(k) = 0 * Bk[0] + 1 * Bk[1] + ... + (n-1) * Bk[n-1]
F(k-1) = 0 * Bk-1[0] + 1 * Bk-1[1] + ... + (n-1) * Bk-1[n-1]
       = 0 * Bk[1] + 1 * Bk[2] + ... + (n-2) * Bk[n-1] + (n-1) * Bk[0]

Then,

F(k) - F(k-1) = Bk[1] + Bk[2] + ... + Bk[n-1] + (1-n)Bk[0]
              = (Bk[0] + ... + Bk[n-1]) - nBk[0]
              = sum - nBk[0]

Thus,

F(k) = F(k-1) + sum - nBk[0]

What is Bk[0]?

k = 0; B[0] = A[0];
k = 1; B[0] = A[len-1];
k = 2; B[0] = A[len-2];故可以先求出f[0]和sum,然后利用公式逐步求F[1],F[2]...并比较大小选取最大值。代码如下:

 1 public class Solution {
 2     public int maxRotateFunction(int[] A) {
 3         int allSum = 0;//所有数字之和
 4         int len = A.length;//数组长度
 5         int F = 0;
 6         for (int i = 0; i < len; i++) {
 7             F += i * A[i];//F[0]
 8             allSum += A[i];
 9         }
10         int max = F;
11         for (int i = len - 1; i >= 1; i--) {
12             F = F + allSum - len * A[i];//F[1],F[2],...
13             max = Math.max(F, max);//找出最大值
14         }
15         return max;
16     }
17 }

(3)Add Binary

解题思路:

从末尾依次对应相加来求,转成int中的相加会使代码比较简洁,因为可以用/和%来分别求出进位和当前往结果中添加的位。然后,把较长的字符串剩下的部分和进位相加放入结果。最后,还要判断进位此时是否为1,如果为1,则需要再往结果中添加1,否则返回结果。

代码一如下:较为简洁

public class Solution {
    public String addBinary(String a, String b) {
        StringBuilder sb = new StringBuilder();
        int i = a.length() - 1, j = b.length() -1, carry = 0;//carry进位标志位
        while (i >= 0 || j >= 0) {
            int sum = carry;
            if (j >= 0) sum += b.charAt(j--) - ‘0‘;
            if (i >= 0) sum += a.charAt(i--) - ‘0‘;
            sb.append(sum % 2);
            carry = sum / 2;
        }
        if (carry != 0) sb.append(carry);
        return sb.reverse().toString();
    }
}

代码二:

 1 public class Solution {
 2     public String addBinary(String a, String b) {
 3         if(a.length() < b.length()){
 4             String tmp = a;
 5             a = b;
 6             b = tmp;
 7         }
 8
 9         int pa = a.length()-1;
10         int pb = b.length()-1;
11         int carries = 0;
12         String rst = "";
13
14         while(pb >= 0){
15             int sum = (int)(a.charAt(pa) - ‘0‘) + (int)(b.charAt(pb) - ‘0‘) + carries;
16             rst = String.valueOf(sum % 2) + rst;
17             carries = sum / 2;
18             pa --;
19             pb --;
20         }
21
22         while(pa >= 0){
23             int sum = (int)(a.charAt(pa) - ‘0‘) + carries;
24             rst = String.valueOf(sum % 2) + rst;
25             carries = sum / 2;
26             pa --;
27         }
28
29         if (carries == 1)
30             rst = "1" + rst;
31         return rst;
32     }
33 }

(4)Nth Digit

解题思路:

 * 这里首先分析一下位数和规律
 * 个位数:1-9,一共9个,共计9个数字
 * 2位数:10-99,一共90个,共计180个数字
 * 3位数:100-999,一共900个,共计270个数字
 * 4位数,1000-9999,一共9000个,共计36000个数字
 * 以此类推,
 * 这样我们就可以首先定位到是哪个数,再找到其对应的数字

代码如下:

 1 public class Solution {
 2     public int findNthDigit(int n) {
 3         //小心溢出
 4         int digitType = 1;
 5         long digitNum = 9;
 6         //定位到是几位数
 7         while(n > digitNum * digitType){
 8             n -= (int) digitNum * digitType ;
 9             digitType++;//几位数
10             digitNum *= 10;
11         }
12         //定位到是这些几位数里面的第几个的第几位
13         int indexInSubRange = (n -1) / digitType;//第几个
14         int indexInNum = (n -1) % digitType;//第几位
15         //还原数字
16         int num = (int)Math.pow(10,digitType - 1) + indexInSubRange ;
17         int result = Integer.parseInt((""+num).charAt(indexInNum)+"");
18         return result;
19     }
20 }

注意:用(n-1)/digitType的原因,因为后面还原数字的时候使用10的幂(10,100,...),但前面其实只有(9,99,...)个数,所有要先减一。

 
时间: 2024-10-12 22:32:23

今天的题目比较难理解。的相关文章

hdu 1301 Jungle Roads 一个很水的题 AC率也可以知道了 但是题目很难理解啊 英语渣o(╯□╰)oKruskal算法

Jungle Roads Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4725    Accepted Submission(s): 3471 Problem Description The Head Elder of the tropical island of Lagrishan has a problem. A burst o

例题:从下边一个成绩表做出三个题,题目比较难理解

33.查询成绩比该课程平均成绩低的同学的成绩表. select*from score a where DEGREE <(select avg(degree) from score b where a.cno=b.cno ) -查询每门课最高分学生之外的其他学生分数信息 select*from score a where DEGREE not in(select MAX(degree) from score b where a.cno=b.cno) a.cno=b.cno 这句代码的意思是在同一门

网络传输的加密与解密(不是很难理解的一个版本)

--网络传输的加密与解密--    由于互联网早期并没有考虑到数据报文安全的问题,早期的理念都是基于进行通信的.现在随着网络兴起,互联网上慢慢有很多"犯罪团体",用较低的犯罪成本通常是基于一个网络通信协议的一个小的漏洞来完成窃取.篡改.重播其他人的数据报文. 而往往计算机网络安全维护者和那些恶意攻击者玩的就是一个类似猫鼠游戏,网络安全维护者处处考虑对计算机的安全负责,而恶意攻击者处处找安全的漏洞.而对于那些恶意攻击方式大体分两种. 一种叫被动攻击,大体上来说就是窃听,攻击者获得传输信息

Javascript之旅——第十站:为什么都说闭包难理解呢?

原文:Javascript之旅--第十站:为什么都说闭包难理解呢? 研究过js的朋友大多会说,理解了js的原型和闭包就可以了,然后又说这些都是js的高级内容,然后就又扯到了各种神马的作用域...然后不少 人就会被忽悠的云里雾里...下面我也试着来说说闭包,看我说的这个是否浅显易懂... 一:闭包含义 闭包是个专业词汇,这样才能显得在js中是高大上的货色,官方定义我这里就不敢修改它,定义如下:就是有权访问另一个函数作用域的变量的函数. 二:一个简单的场景 上面的定义大概也能看得懂,但是不知道为什么

ACM_题目这么难,来局愉快的昆特牌吧

题目这么难,来局愉快的昆特牌吧 Time Limit: 2000/1000ms (Java/Others) Problem Description: 小Z打比赛,然而比赛太难了,他坐在电脑面前被题淹没不知所措,决定开始打一局昆特牌来舒缓心情,然而这个规则出题人也帮他想好了,他发给小Z三种牌,分别是'A''C''M',每集齐一套'A''C''M',小Z就能放一个技能,听起来酷对不对?现在给出小Z手中的牌,问你他能放多少次技能. Input: 输入包含多组样例,第一行为一个整数T(1≤T≤100)表

uvalive 6957 Hyacinth 题目难理解

#include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include <vector> #include <queue> #include <stack> #include <set> #include <map> #include <string> #include <ma

神奇的 SQL 之谓词 → 难理解的 EXISTS

前言 开心一刻 我要飞的更高,飞的更高,啊! 谓词 SQL 中的谓词指的是:返回值是逻辑值的函数.我们知道函数的返回值有可能是数字.字符串或者日期等等,但谓词的返回值全部是逻辑值(TRUE/FALSE/UNKNOW),谓词是一种特殊的函数.关于逻辑值,可以查看:神奇的 SQL 之温柔的陷阱 → 三值逻辑 与 NULL ! SQL 中的谓词有很多,如 =.>.<.<> 等,我们来看看 SQL 具体有哪些常用的谓词 比较谓词 创建表与初始化数据 -- 1.表创建并初始化数据 DROP

特重要又特难理解应用的——数组和集合

这一章的学习,在视频学习中,感觉已经快懵了,可以说是懵懂,知识点太多,应用繁杂,再结合上章尚未完全消化的if语句和循环利用,考验自己对于问题的逻辑思维能力.这一章的练习作业多,有一定的复杂程度,还未做完,自己心里清楚,如果不自己独立思考完成这些课后作业,就没法通过这一章的学习.尽管习题难,结合视频中的案例分析做法和补充的课外总结,还能勉强找到编程思路,争取明天完成这一章的练习作业,并能不看代码,完成视频教学中的案例编程,相信自己能行!!!

2014年七月华为校招机试题目--最难的一道, 呵呵!

今天百无聊赖之时, 漫心看到14年的华为校招机试题目, 一共三道, 前两道皆是平平, 第三道却柳暗花明, 让人眼前一亮. 咋一看, 饶有趣味, 看似平淡无奇, 然而却玄机颇深(对我这种弱渣而言).(不过对于ACMer, 好像应该用基础算法, 就能解决!) (然而我也只会基础的算法!!忏愧的紧!!!).如果有幸被大神看到, 能指点我一两招, 不胜感激!  下面是题目和我的详细题解思路(可供巨巨一笑!嘿嘿!). 2014年七月华为校招机试题目: 第三题: 输入一个正整数X,在下面的等式左边的数字之间