当前位置:   article > 正文

leetcode刷题_有一个包含 nn 个元素的整数数组 aa,对 aa 可以进行以下两种操作: 修改元素:modif

有一个包含 nn 个元素的整数数组 aa,对 aa 可以进行以下两种操作: 修改元素:modif

真的真的是菜鸟级的刷题,滴水穿石,加油加油加油!

目录

1. 两数之和

9.回文数

20.有效的括号

13.罗马数字转整数

27.移除元素

38 报数

118 杨辉三角

171 Excel表列序号

136 只出现一次的数字


1. 两数之和

【题目描述】

给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。

你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。

示例:

  1. 给定 nums = [2, 7, 11, 15], target = 9
  2. 因为 nums[0] + nums[1] = 2 + 7 = 9
  3. 所以返回 [0, 1]

【Java1.0】

  1. class Solution {
  2. public int[] twoSum(int[] nums, int target) {
  3. int[] res = new int[2];
  4. int temp = 0;
  5. for(int i = 0; i < nums.length; i++){
  6. temp = target - nums[i];
  7. for(int j = 0; j < nums.length; j++){
  8. if(nums[j] == temp && j!=i)
  9. {
  10. res[0] = i;
  11. res[1] = j;
  12. return res;
  13. }
  14. }
  15. }
  16. return res;
  17. }
  18. }

时间复杂度o(n2)

【java2.0]

利用哈希表,将给出的数字作为键, 下标作为值,<2, 0><7, 1><11, 2><15, 3>

map.containsKey(键) ,判断某一个键是否在哈希表中

map.get(键)得到的是键为某数的value值

为什么不用下标作为键,给出的数字作为值呢?<0, 2><1, 7><2, 11><3, 15>

在判断target-nums[i]在不在哈希表中时,是判断哈希表中的值,v==map.get(?),用哪个下标才能找到值呢,不能,除非遍历,所以将给出的数字作为键,这样在判断的时候,map.containsKey(v)就可以判断给出的数字在不在哈希表中的键, 并且如果存在,要判断这个键对应的下标和i相不相同。其实这样利用哈希表,就是将数组中的下标和值反了过来,利用map.containsKey(v),相似于遍历数组中的值,这样减少了时间复杂度。嗯,脑子笨只能一点一点来了。

  1. class Solution {
  2. public int[] twoSum(int[] nums, int target) {
  3. int[] result = new int[2];
  4. Map<Integer, Integer> map = new HashMap<>();
  5. for(int i = 0; i < nums.length; i++){
  6. map.put(nums[i], i);
  7. }
  8. for(int i = 0; i < nums.length; i++){
  9. int v = target - nums[i];
  10. if(map.containsKey(v) && i!=map.get(v)){
  11. result[0] = i;
  12. result[1] = map.get(v);
  13. return result;
  14. }
  15. }
  16. return result;
  17. }
  18. }

9.回文数

【题目描述】

判断一个整数是否是回文数。回文数是指正序和倒序读都是一样的整数。

【java1.0】将整数转换为字符串,再转化为字符数组

  1. class Solution{
  2. public boolean isPalindrome(int x){
  3. String s = Integer.toString(x);
  4. int length = x.length();
  5. char cs[] = s.toCharArray();
  6. for(int i = 0; i< length/2; i++){
  7. if(cs[i]!=cs[length-i-1]){
  8. return false;
  9. }
  10. }
  11. return true;
  12. }
  13. }

【java2.0】将整数转换为字符串,然后反转字符串,与原字符串比较

  1. class Solution {
  2. public boolean isPalindrome(int x) {
  3. String s = Integer.toString(x);
  4. int length = s.length();
  5. StringBuffer sb = new StringBuffer(sb);
  6. sb.reverse(); //sb字符串反转
  7. for( int i = 0; i< length; i++){
  8. if(s.charAt(i) != sb.charAt(i))
  9. return false;
  10. }
  11. return true;
  12. }

【java3.0】将数字整除获得每一位数,相当于字符串反转。

值得注意的几个边界值是:

  1. 整数小于0时,一定不是回文。
  2. 整数为0时,是回文数。

(所以在代码时,一定要注意特殊的边界值,尽可能考虑全面)

  1. class Solution {
  2. public boolean isPalindrome(int x) {
  3. int y = 0;
  4. int temp = x;
  5. if(x < 0){
  6. return false;
  7. }
  8. else{
  9. while( temp!=0 ){
  10. y = y * 10 + temp % 10;
  11. temp = temp / 10;
  12. }
  13. if ( x == y)
  14. return true;
  15. else
  16. return false;
  17. }
  18. }
  19. }

20.有效的括号

【题目描述】

给定一个只包括 '('')''{''}''['']' 的字符串,判断字符串是否有效。

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。

注意空字符串可被认为是有效字符串。

【java 1.0】运用stack的操作进行判断,后续可以用switch-case改进,应该可以有更好的方法。

  1. class Solution {
  2. public boolean isValid(String s) {
  3. Stack stack = new Stack();
  4. for(int i = 0; i < s.length(); i++){
  5. if(s.charAt(i) == '(' || s.charAt(i) == '[' || s.charAt(i) == '{'){
  6. stack.push(s.charAt(i));
  7. }
  8. else if(s.charAt(i) == ')'){
  9. if(stack.empty())
  10. return false;
  11. else if((Character)stack.peek() == '('){
  12. stack.pop();
  13. }
  14. else return false;
  15. }
  16. else if(s.charAt(i) == ']'){
  17. if(stack.empty())
  18. return false;
  19. else if((Character)stack.peek() == '['){
  20. stack.pop();
  21. }
  22. else return false;
  23. }
  24. else {
  25. if(stack.empty())
  26. return false;
  27. else if((Character)stack.peek() == '{'){
  28. stack.pop();
  29. }
  30. else return false;
  31. }
  32. }
  33. if(stack.empty())
  34. return true;
  35. else
  36. return false;
  37. }
  38. }

13.罗马数字转整数

【java1.0】运用map存储罗马数字,然后根据给出的字符串判断加减

  1. class Solution {
  2. public int romanToInt(String s) {
  3. HashMap<Character, Integer> m = new HashMap<Character, Integer>();
  4. m.put('I', 1);
  5. m.put('V', 5);
  6. m.put('X', 10);
  7. m.put('L', 50);
  8. m.put('C', 100);
  9. m.put('D', 500);
  10. m.put('M', 1000);
  11. int result = 0;
  12. char[] c = s.toCharArray();
  13. for(int i = 0; i < s.length(); i++ )
  14. {
  15. if(i == s.length()-1){ //如果是数组的最后一个,就没有和下一个数字比较了
  16. result += m.get(c[i]);
  17. return result;
  18. }
  19. else{
  20. if(m.get(c[i]) >= m.get(c[i+1])){
  21. result += m.get(c[i]);
  22. }
  23. else{
  24. result -= m.get(c[i]);
  25. }
  26. }
  27. }
  28. return result;
  29. }
  30. }

27.移除元素

【java1.0】将不是val值的元素往前移动,覆盖val值得元素

  1. class Solution {
  2. public int removeElement(int[] nums, int val) {
  3. int lenTotal = 0;
  4. int lenRemove = 0;
  5. for ( int i = 0; i< nums.length; i++){
  6. if(nums[i] == val){
  7. lenRemove+=1;
  8. }
  9. else{
  10. lenTotal++;
  11. nums[i-lenRemove] = nums[i];
  12. }
  13. }
  14. return lenTotal;
  15. }
  16. }

38 报数

刚拿到题目的时候审不懂题意,看其他的大牛们的解释才明白。

其实原则就是:默认第一个数为1,然后第二个、第三个、、、依次“读”出前面的数。“读”的意思就是,比如1,我们会读作,"一个一",因此,第二个数字就是11;然后第三个数读第二个数,读作“两个一”,因此第三个数字就是21;然后第四个数读第三个数,读作“一个二,一个一”,因此,第四个数字就是1121。总结来说就是,读出前一个数的数字构成,作为下一个数。

  1. 因为涉及到前一个数字,所以采用递归的方式。
  2. 又因为我们需要输出一个字符串,而且我们在递归读数的过程中需要不断的更新这个字符串,所以用stringBuffer保存这个字符串,因为stringbuffer是变量,string是字符串常量,所以在更新的过程中stringBuffer的速度更快。

【java1.0】

  1. class Solution {
  2. public String countAndSay(int n) {
  3. if(n == 1){
  4. return "1";
  5. }
  6. else{
  7. String post = countAndSay(n-1); //递归获取前一个数
  8. StringBuilder result = new StringBuilder(); //相比string,速度更快
  9. int len = post.length();
  10. int count = 1;
  11. for( int i = 0; i< len; i++){
  12. if(i == len-1){ //最后一个元素,直接将目前的计数和最后一个元素存入result
  13. result.append(count);
  14. result.append(post.charAt(i));
  15. break;
  16. }
  17. if(post.charAt(i+1) == post.charAt(i)){
  18. count++; //元素相同,累加计数
  19. }
  20. else{
  21. result.append(count); //前一个元素与后一个元素不同,将前一个元素个数和前一个元素存入result中,后面还需要将count重置为1
  22. result.append(post.charAt(i));
  23. count = 1;
  24. }
  25. }
  26. return result.toString();
  27. }
  28. }
  29. }

118 杨辉三角

求杨辉三角很简单,其实就是利用a[i][j] = a[i-1][j-1] + a[i-1][j]往下累加计算。

这里要求存储在二维列表里(我也不清楚是不是应该这么叫),但是我先将结果存储在二维数组中,然后再存入二维列表中。

对列表添加元素的操作是  list.add(元素值),所以在转化二维列表的过程中,先新建一个一维列表,将每一行的结果存入,然后list.add(内层的一维列表)。

  1. class Solution {
  2. public List<List<Integer>> generate(int numRows) {
  3. List<List<Integer>> list = new ArrayList<List<Integer>>(); //存放结果
  4. int[][] a = new int[numRows][numRows]; //暂时存放结果
  5. for(int i = 0; i< numRows; i++){
  6. for(int j = 0 ; j< i+1; j++){
  7. if( i == 0){
  8. a[i][j] = 1; //第一行
  9. }
  10. else if( j == 0 | j == i){ //每一行的第一个和最后一个元素
  11. a[i][j] = 1;
  12. }else{
  13. a[i][j] = a[i-1][j-1]+a[i-1][j]; //计算中间元素
  14. }
  15. }
  16. }
  17. for(int i = 0; i< numRows; i++){
  18. List<Integer> jlist = new ArrayList<Integer>();
  19. for(int j = 0 ; j< i+1; j++){
  20. jlist.add(a[i][j]); //将每一行的结果存入jlist
  21. }
  22. list.add(jlist); //将每一行的结果存入list
  23. }
  24. return list;
  25. }
  26. }

171 Excel表列序号

要写这道题需要明确列序列号和列名称之间的对应关系。

列名称的命名规则为:A,B,C,D,,,,,,X,Y,Z,AA,AB,AC,,,,,,AX,AY,AZ,BA,BB,BC,,,,,,BX,BY,BZ,,,,,,,,YZ,ZA,ZB,ZC,,,ZX,ZY,ZZ,AAA,AAB,AAC,,,,,AAX,AAY,AAZ,ABA,ABB,ABC,ABD,,,,,,ABX,ABY,ABZ,,,,,,(注意加粗部分的转换),其实相当于“多级索引”,用一个字母可以表示26列,然后从第27个数字开始,使用“二级索引”,即用两个字母表示列,而且第二级索引也就是从右往左的第二个字母(AA),是从A-Z顺序使用的,与“一级索引”相同。

对应关系:

A---260*1

B---260*2

C--260*3

...

Y---260*25

Z---260*26

AA---27= 261*1+260*1

AB---28= 261*1+260*2

...

AZ---52= 261*1+260*26

BA--- 53= 261*2+260*1

...

YZ---676= 261*25+260*26

ZA---677= 261*26+260*1

ZZ---702= 261*26+260*26

AAA---703=262*1 + 261*1+260*1

AAB---704=262*1 + 261*1+260*2

(其中到达第几层就是26的几次方,对应哪个字母就是乘以几)

【java1.0】

(不知道为什么leetcode里求次方不能用Math.pow(26, 2),所以写了一个循环计算)

  1. class Solution {
  2. public int titleToNumber(String s) {
  3. char[] alpha = new char[27];
  4. for(int i = 1; i <= 26; i++){ //将每个字母对应的数字设置为其索引
  5. alpha[i] = (char)('A'+i-1);
  6. }
  7. String a = new String(alpha);
  8. int len = s.length(); //计算输入的字符串的长度,为了下面的计算
  9. char[] input = s.toCharArray();
  10. int result = 0;
  11. int temp = 0;
  12. for(int i = 0; i < len; i++){
  13. int b = 1;
  14. //temp = a.indexOf(input[i])
  15. temp = len-i-1; //计算处于第几层索引
  16. for(int j = 1; j<=temp; j++) //计算次方
  17. b *= 26;
  18. result += b*a.indexOf(input[i]); //将每一层的结果累加
  19. }
  20. return result;
  21. }
  22. }

136 只出现一次的数字

1. 题目要求线性时间复杂度,不能使用额外的空间。

我竟然首先想到的是先排序,再判断,这样相同的两个数字就可以放在一起,不用对每个出现的数字计算出现的次数,但是java的排序函数Arrays.sort()函数的时间复杂度是o(n),并不符合题目要求。

【java1.0】

  1. class Solution {
  2. public int singleNumber(int[] nums) {
  3. Arrays.sort(nums); //排序
  4. for(int i = 0; i< nums.length; i+=2){ //判断每两个数是不是相同
  5. if(i == nums.length -1){ //判断到最后一个数字,说明前面的都是成对存在,只有最后一个数个数为1,比如1,1,2,2,3
  6. return nums[i];
  7. }
  8. if( nums[i] != nums[i+1]) //如果存在两个数不同,说明第一个数出现的次数为1,比如1,1,2,3,3
  9. return nums[i];
  10. }
  11. return 0;
  12. }
  13. }

由于对于这种不能使用额外空间的问题不是很了解,所以查阅了网上的解题方法,决定采用亦或的方法。

举例:1,1,2,2,4 

1^1^2^2^4 = (1^1)^(2^2)^4=0^0^4=4

所以把所有的数字进行异或操作,两个相同的数字异或结果为0,剩下的一个是数字就是结果

6^5  = 3   

6^5^5 = 6

【java2.0】

  1. class Solution {
  2. public int singleNumber(int[] nums) {
  3. int result = 0;
  4. for(int i = 0; i< nums.length; i++){
  5. result = result^nums[i];
  6. }
  7. return result;
  8. }
  9. }

412. Fizz Buzz

今天这一题很简单,完全就是if-else的简单使用。

复习一下list操作:

新建一个list: List<String> aaa = new ArrayList<>();

添加元素:aaa.add()  aaa.add(索引,值)

删除元素:aaa.remove()

获取元素:aaa.get(索引或者值)

是否包含:aaa.contains(值),返回值true或者false

修改元素:aaa.set(索引,值)

  1. class Solution {
  2. public List<String> fizzBuzz(int n) {
  3. List<String> result = new ArrayList<>();//新建list
  4. for( int i = 1; i<=n; i++){
  5. if( (i % 3 == 0) && (i % 5 == 0)){ //同时被3和5整除
  6. result.add("FizzBuzz");
  7. }
  8. else if( i % 3 == 0){ //被3整除
  9. result.add("Fizz");
  10. }else if( i % 5 == 0){ //被5整除
  11. result.add("Buzz");
  12. }else{
  13. result.add(String.valueOf(i)); //不能整除
  14. }
  15. }
  16. return result;
  17. }
  18. }

 

 

 

 

 

 

 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/93665
推荐阅读
相关标签
  

闽ICP备14008679号