LeetCode
- 题目一: 罗马数字转整数
罗马数字包含以下七种字符:
I(1)
,V(5)
,X(10)
,L(50)
,C(100)
,D(500)
和M(1000)。
通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:
I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。
给定一个罗马数字,将其转换成整数。
- 解题思路
①首先将七种字符存到映射中
② 先判字符串中是不是只有一个字符,只有一个那么直接返回它的值
③长度大于1,则进行遍历。某个位置的字符与后一个字符比较,这个字符小于后于一个则从sum减去这个字符对应的值(因为像IV=V-I),否则sum加这个字符对应的值。
④遍历结束返回结果 sum
【知识点】
①取字符串指定位置字符
String.charAt()
②Map
//创建映射 Map<Key,Value> map=new HashMap<>(); //添加数据 Map.put(key,value); //获取数据 Map.get(key);
- 代码
public class LeetCodeString { public static void main(String[] args) { System.out.println(romanToInt("MCMXCIV")); } public static int romanToInt(String s) { Map<Character, Integer> roman=new HashMap<>(); roman.put('I', 1); roman.put('V', 5); roman.put('X', 10); roman.put('L', 50); roman.put('C', 100); roman.put('D', 500); roman.put('M', 1000); int sum=0; int len=s.length(); if(len==1) { sum+=roman.get(s.charAt(0)); return sum; } for(int i=0;i<len;) { int ii=roman.get(s.charAt(i)); if(i+1<len){ if(ii<roman.get(s.charAt(i+1))) { sum-=ii; i++; }else { sum+=ii; i++; } }else { //最后一个字符 sum+=ii; i++; } } return sum; } }
- 题目二: 最长公共前缀
编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串
""
。
- 解题思路
①以第一个字符串为基准寻找公共前缀,所以确保第一个字符串不是null,如果null直接返回
"",
如果不是null获取其长度。② 定义一个变量index,指向每个字符串的第一个位置
③以index小于第一个字符串的长度为条件进行while循环
④获取第一个字符串第index位置的字符
⑤遍历字符串数组,每个字符串的第index位置与第一个字符串的第index位置进行比较
⑥当某个字符串长度小于index或者第index位置的字符不等于第一个字符串的第index位置的字符,那么返回已找到的最长前缀
【知识点】
①取字符串指定位置字符
String.charAt()
- 代码
public class LeetCodeString { public static void main(String[] args) { String[] strs = { "ab", "a" }; System.out.println(longestCommonPrefix(strs)); } public static String longestCommonPrefix(String[] strs) { String p = ""; int len = 0; if (strs[0] != null) { len = strs[0].length(); } else { return p; } int index = 0; while (index < len) { char c = strs[0].charAt(index); for (String string : strs) { if (index < string.length()) { if (string.charAt(index) != c) { return p; } }else { return p; } } p += c; index++; } return p; } }
nowcoder
- 题目:将所有获取奖金的员工当前的薪水增加10%
请你写出更新语句,将所有获取奖金的员工当前的(salaries.to_date='9999-01-01')薪水增加10%。(emp_bonus里面的emp_no都是当前获奖的所有员工,不考虑获取的奖金的类型)。
已有数据:
drop table if exists emp_bonus; drop table if exists `salaries` ; create table emp_bonus( emp_no int not null, btype smallint not null); CREATE TABLE `salaries` ( `emp_no` int(11) NOT NULL, `salary` float(11,1) default NULL, `from_date` date NOT NULL, `to_date` date NOT NULL, PRIMARY KEY (`emp_no`,`from_date`)); insert into emp_bonus values(10001,1); INSERT INTO salaries VALUES(10001,85097,'2001-06-22','2002-06-22'); INSERT INTO salaries VALUES(10001,88958,'2002-06-22','9999-01-01');
提交结果:
10001|85097.000|2001-06-22|2002-06-22 10001|97853.800|2002-06-22|9999-01-01
- 解题思路
①通过联表确定拿到奖金的当前员工
②加薪10%等于原来的薪水乘1.1
【知识点】
①数据库更新
update <表名> set <列名> where <条件>
- 代码
update salaries,emp_bonus set salaries.salary=salaries.salary*1.1 where emp_bonus.emp_no=salaries.emp_no and salaries.to_date='9999-01-01'