算法练习LeetCode初级算法之数组
删除数组中的重复项
官方解答:
旋转数组
存在重复元素
只出现一次的数
官方解答: 同一个字符进行两次异或运算就会回到原来的值
两个数组的交集 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初级算法之数组的更多相关文章
- 【LeetCode算法】LeetCode初级算法——字符串
在LeetCode初级算法的字符串专题中,共给出了九道题目,分别为:反转字符串,整数反转,字符串中的第一个唯一字符,有效的字母异位词,验证回文字符串,字符串转换整数,实现strStr(),报数,最 ...
- 算法练习LeetCode初级算法之字符串
反转字符串 我的解法比较low,利用集合的工具类Collections.reverse反转,用时过长 class Solution { public void reverseString(char[] ...
- 算法练习LeetCode初级算法之链表
删除链表中的节点 /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode ne ...
- 算法练习LeetCode初级算法之数学
Fizz Buzz class Solution { public List<String> fizzBuzz(int n) { List<String> list=new L ...
- 算法练习LeetCode初级算法之设计问题
打乱数组 不断的让第一个与后面随机选择的数交换 class Solution { private int[] nums; private int[] initnums; public Solution ...
- 算法练习LeetCode初级算法之排序和搜索
合并两个有序数组 class Solution { public void merge(int[] nums1, int m, int[] nums2, int n) { System.arrayco ...
- 算法练习LeetCode初级算法之树
二叉树的前序遍历 我的解法:利用递归,自底向下逐步添加到list,返回最终的前序遍历list class Solution { public List<Integer> preorderT ...
- 算法练习LeetCode初级算法之其他
位1的个数 解法一: class Solution { // you need to treat n as an unsigned value public int hammingWeight(int ...
- 算法练习LeetCode初级算法之动态规划
爬楼梯:斐波那契数列 假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数. 非递归解法 class S ...
随机推荐
- python:基本统计值计算(平均数,方差,中位数)
#CalStatisticsV1.py def getNum(): #获取用户不定长度的输入 nums=[] test=input("请输入要存储的数据(回车退出):") whil ...
- CenterOS7.5中搭建wordpress
centeros7.5中搭建wordpress 1.环境 云平台:华为云 服务器操作系统:CentOS7.: 博客部署的服务器:Apache HTTP: 数据库:mysql: 框架:wordpress ...
- ubuntu12.04 64bit libncurses5-dev和libncurses5-dev:i386共存性问题讨论
ubuntu12.04 64bit 编译kernel(或者make menuconfig)源码时出现如下错误: HOSTLD scripts/kconfig/mconf scripts/kconfig ...
- Python输入语句
什么是输入 咱们在银行ATM机器前取钱时,肯定需要输入密码,对不? 那么怎样才能让程序知道咱们刚刚输入的是什么呢?? 大家应该知道了,如果要完成ATM机取钱这件事情,需要先从键盘中输入一个数据,然后用 ...
- Python模块hashlib
Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 什么是摘要算法呢?摘要算法又称哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制 ...
- [转]Java事件处理机制- 事件监听器的四种实现方式
原文来自http://stefan321.iteye.com/blog/345221 自身类作为事件监听器 外部类作为事件监听器 匿名内部类作为事件监听器 内部类作为事件监听器 自身类作为事件监听器: ...
- 查询 SQL_Server 所有表的记录数: for xml path
--我加了 top 10 用的时候可以去掉 declare @select_alltableCount varchar(max)='';with T as (select top 10 'SELECT ...
- Lepus监控之SQLServer配置(后续整理)
1.安装pymssql模块 1-1.环境准备: 1-1-1.unixODBC安装 yum install unixODBC unixODBC-devel -y 1-1-2.freetds安装下载 fr ...
- C语言 练习题
subString #include <iostream> int subString(char* sSeek, char* sKey) { char* p = sSeek; while( ...
- background-size的应用情景:当给出的背景图片大于实际网页需要布局的图片大小时
网页需求是:50*50 如果只设置 width:50px;height:50px;background-image("images/XXX.png"); 效果如下: 添加设置:b ...