字符串与SQL-第7天

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'

猜你喜欢

转载自blog.csdn.net/weixin_46899412/article/details/123760237
今日推荐