• 删除数组中的重复项

官方解答:

  • 旋转数组

  • 存在重复元素

  • 只出现一次的数

   

官方解答:  同一个字符进行两次异或运算就会回到原来的值

  • 两个数组的交集 II

import java.util.ArrayList;

import java.util.Arrays;

import java.util.List;

public class LeetCode {

public static void main(String[] args) {

Solution solution = new Solution();

int a[] = {1,2,2 ,1,3};

int n[]= {2,2,3};

System.out.println(Arrays.toString(solution.intersect(a,n)));

}

}

class Solution {

public int[] intersect(int[] nums1, int[] nums2) {

List<Integer> list=new ArrayList<>();

Arrays.sort(nums1);

Arrays.sort(nums2);

int n=nums1.length;

int m=nums2.length;

int j=0;

int i=0;

while (i<n&&j<m) {

if (nums1[i]>nums2[j]) {

j++;

}else if (nums1[i]<nums2[j]) {

i++;

}else {

list.add(nums1[i]);

i++;

j++;

}

}

int sum[] = new int[list.size()];

int p=0;

for (int k : list) {

sum[p]=k;

p++;

}

return sum;

}

}

  • 加一

    这个题目要注意考虑[0]和[9]的情况,还有[9,9,9]的情况!!!

class Solution {

public int[] plusOne(int[] digits) {

for (int i = digits.length-1; i >= 0; i--) {

if (digits[i]==9) {

digits[i]=0;

}else {

digits[i]++;

return digits;

}

}

int[] sum=new int[digits.length+1];

sum[0]=1;

for (int i = 1; i < sum.length; i++) {

sum[i]=digits[i-1];

}

return sum;

}

}

  • 有效数独

我的解法:利用队列,容易理解。

import java.util.LinkedList;

import java.util.Queue;

class Solution {

public boolean isValidSudoku(char[][] board) {

for (int i = 0; i < 9; i++) {

Queue<Character> queue=new LinkedList<>();

for (int j = 0; j < 9; j++) {

if (Character.isDigit(board[i][j])) {

queue.offer(board[i][j]);

}

}

while (!queue.isEmpty()) {

char b=queue.poll();

if (queue.contains(b)) {

return false;

}

}

}

for (int i = 0; i < 9; i++) {

Queue<Character> queue=new LinkedList<>();

for (int j = 0; j < 9; j++) {

if (Character.isDigit(board[j][i])) {

queue.offer(board[j][i]);

}

}

while (!queue.isEmpty()) {

char b=queue.poll();

if (queue.contains(b)) {

return false;

}

}

}

int k=0;

while (k<9) {

Queue<Character> queue=new LinkedList<>();

for (int j = k; j < k+3; j++) {

for (int j2 = 0; j2 < 3; j2++) {

if (Character.isDigit(board[j2][j])) {

queue.offer(board[j2][j]);

}

}

}

while (!queue.isEmpty()) {

char b=queue.poll();

if (queue.contains(b)) {

return false;

}

}

for (int j = k; j < k+3; j++) {

for (int j2 = 3; j2 < 6; j2++) {

if (Character.isDigit(board[j2][j])) {

queue.offer(board[j2][j]);

}

}

}

while (!queue.isEmpty()) {

char b=queue.poll();

if (queue.contains(b)) {

return false;

}

}

for (int j = k; j < k+3; j++) {

for (int j2 = 6; j2 < 9; j2++) {

if (Character.isDigit(board[j2][j])) {

queue.offer(board[j2][j]);

}

}

}

while (!queue.isEmpty()) {

char b=queue.poll();

if (queue.contains(b)) {

return false;

}

}

k+=3;

}

return true;

}

}

官方解答,利用了hashmap键值对,也好理解!

class Solution {

public boolean isValidSudoku(char[][] board) {

// init data

HashMap<Integer, Integer> [] rows = new HashMap[9];

HashMap<Integer, Integer> [] columns = new HashMap[9];

HashMap<Integer, Integer> [] boxes = new HashMap[9];

for (int i = 0; i < 9; i++) {

rows[i] = new HashMap<Integer, Integer>();

columns[i] = new HashMap<Integer, Integer>();

boxes[i] = new HashMap<Integer, Integer>();

}

// validate a board

for (int i = 0; i < 9; i++) {

for (int j = 0; j < 9; j++) {

char num = board[i][j];

if (num != '.') {

int n = (int)num;

int box_index = (i / 3 ) * 3 + j / 3;//此处将数独分配到0-9个3*3的正方格内

// keep the current cell value

rows[i].put(n, rows[i].getOrDefault(n, 0) + 1);

columns[j].put(n, columns[j].getOrDefault(n, 0) + 1);

boxes[box_index].put(n, boxes[box_index].getOrDefault(n, 0) + 1);

// check if this value has been already seen before

if (rows[i].get(n) > 1 || columns[j].get(n) > 1 || boxes[box_index].get(n) > 1)

return false;

}

}

}

return true;

}

}

大神解答,过于难理解,现阶段不要求掌握,仅向大神学习!!!

画红色的部分为遍历3*3的方格内数字是否重复,首先分别将0、1、2和第1行和第2行的每个数比较

然后再用第1行的每个数分别于第2行比较,因为数自身所在的行在前面的for循环中已经比较过了,

所以无需再比较。

  • 旋转图像

解答:

class Solution {

public void rotate(int[][] matrix) {

int len=matrix.length;

for (int i = 0; i < len/2; i++) {//外层for循环看有多少层

int start=i;

int end=len-1-i;

for (int j = 0; j < end-start; j++) {//内层for循环看每层要几次循环替换

int temp=matrix[start][start+j];

matrix[start][start+j]=matrix[end-j][start];

matrix[end-j][start]=matrix[end][end-j];

matrix[end][end-j]=matrix[start+j][end];

matrix[start+j][end]=temp;

}

}

}

}

代码看似简单,逻辑实则有些难度!!

外层循环要首先确定两个指针 头:start和尾: end

然后根据普通值来确定二维数组下标,不要根据特殊值,那样没法确定;

由于目前技术有限博客园客户端没有调好,导致格式看起来很难受!!!

算法练习LeetCode初级算法之数组的更多相关文章

  1. 【LeetCode算法】LeetCode初级算法——字符串

      在LeetCode初级算法的字符串专题中,共给出了九道题目,分别为:反转字符串,整数反转,字符串中的第一个唯一字符,有效的字母异位词,验证回文字符串,字符串转换整数,实现strStr(),报数,最 ...

  2. 算法练习LeetCode初级算法之字符串

    反转字符串 我的解法比较low,利用集合的工具类Collections.reverse反转,用时过长 class Solution { public void reverseString(char[] ...

  3. 算法练习LeetCode初级算法之链表

    删除链表中的节点 /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode ne ...

  4. 算法练习LeetCode初级算法之数学

    Fizz Buzz class Solution { public List<String> fizzBuzz(int n) { List<String> list=new L ...

  5. 算法练习LeetCode初级算法之设计问题

    打乱数组 不断的让第一个与后面随机选择的数交换 class Solution { private int[] nums; private int[] initnums; public Solution ...

  6. 算法练习LeetCode初级算法之排序和搜索

    合并两个有序数组 class Solution { public void merge(int[] nums1, int m, int[] nums2, int n) { System.arrayco ...

  7. 算法练习LeetCode初级算法之树

    二叉树的前序遍历 我的解法:利用递归,自底向下逐步添加到list,返回最终的前序遍历list class Solution { public List<Integer> preorderT ...

  8. 算法练习LeetCode初级算法之其他

    位1的个数 解法一: class Solution { // you need to treat n as an unsigned value public int hammingWeight(int ...

  9. 算法练习LeetCode初级算法之动态规划

    爬楼梯:斐波那契数列 假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数. 非递归解法 class S ...

随机推荐

  1. 全志A33 lichee 搭建Qt App开发环境编写helloworld

    开发平台 * 芯灵思SinlinxA33开发板 淘宝店铺: https://sinlinx.taobao.com/ 嵌入式linux 开发板交流 QQ:641395230 Step 1 在虚拟机(Ce ...

  2. Java高级特性 第4节 输入输出流

    一.使用I/O操作文件 关键步骤: 使用File类操作文件或目录属性 使用FileInputStream类读文本文件 使用FileOutputStram类写文本文件 使用BufferedReader类 ...

  3. nginx gzip配置

    参考: https://docs.nginx.com/nginx/admin-guide/web-server/compression/ server { gzip on;    gzip_types ...

  4. Windows10右键添加"在此处打开命令窗口"

    添加注册表: Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\Directory\shell\OpenCmdHere] @=" ...

  5. android ButterKnife 点击事件没反应的解决方案

    可能只添加了 implementation 'com.jakewharton:butterknife:8.8.1'而没有添加下面这行 annotationProcessor 'com.jakewhar ...

  6. vue-cli脚手架build目录中的build.js配置文件

    该随笔收藏自: vue-cli脚手架build目录中的build.js配置文件 这个配置文件是命令npm run build 的入口配置文件,主要用于生产环境 由于这是一个系统的配置文件,将涉及很多的 ...

  7. OOM三种情况

    第一种OutOfMemoryError: PermGen space发生这种问题的原意是程序中使用了大量的jar或class,使java虚拟机装载类的空间不够,与Permanent Generatio ...

  8. python下selenium自动化测试自我实践

    周末实验自动化提交数据时,本来没打算写记录的,不过遇到一些问题,觉得可以提提.基本操作就不用写了,搜索过程中都发现了两个博客都出了selenium+python的书,说明操作一搜一大把. 1. 等待页 ...

  9. ORACLE_11G归档空间满,由于数据库装完后使用的是默认空间是闪回区

    1.首先根据alert跟踪日志发现归档空间满,路径大致如下:cd $ORACLE_BASE/diag/rdbms/jsswgsjk/jsswgsjk1/tracetail -f alert_jsswg ...

  10. openStack 重新resize时会进行重新调度,可能在本机Resize 扩展资源,也可能存在的情况时 ,新扩展的资源在当前节点不足分配,整个虚拟机将进行迁移调度,进行异机迁移时需要迁移 的两台主机间能使用nova系统用户经passless登录

    openStack 重新resize时会进行重新调度,可能在本机Resize 扩展资源,也可能存在的情况时 ,新扩展的资源在当前节点不足分配,整个虚拟机将进行迁移调度,进行异机迁移时需要迁移 的两台主 ...