Coding-数组(Array)

(LeetCode)Rotate Array --- 逆置数组 阅读详情

数组(Array)

面试中最常见的就是围绕数组进行出题,主要原则数组可以随机读取,一般遇到数组相关的题目,都不是直观看到的那样。第一步暴力解法,第二步是否可以排序,是否可以二分,是否可以使用数据结构(哈希表,队列,栈等)。
要时刻注意一个数组中有两列数,一列是给定的数组的值,另一个是数组的下标。

1. two sum

题目: 给你一个数组arr,和一个目标值target,找到一组下标(i,j)使得arriarr_iarri​+ arrjarr_jarrj​= targettargettarget。
进阶: 数组中有重复的值,找到所有可能的下标组合。
例如arr = [1, 2, 3, 3, 2, 4] target = 5。 return {(0, 5), (1, 2), (1, 3), (2, 4), (3, 4)}。
公司: 各大公司

pair<int, int> twosum(int *arr, int n, int target) {
    map<int, int> hash;
    pair<int, int> result;

    for(int i = 0; i < n; i++) {
        if(hash.find(arr[i]) == hash.end()) {
            hash[target - arr[i]] = i;
        }
        else {
            result = make_pair(hash[arr[i]], i);
            break;
        }
    }
    return result;
}

vector<pair<int, int> > twosumplus(int *arr, int n, int target) {
    map<int, vector<int> > hash;
    for(int i = 0; i < n; i ++) {
        if(hash.find(arr[i]) == hash.end()) {
            vector<int> tmp;
            tmp.push_back(i);
            hash[arr[i]] = tmp;
        }
        else {
            hash[arr[i]].push_back(i);
        }
    }
    vector<pair<int, int> > results;
    for(int i = 0; i < n; i ++) {
        map<int, vector<int>>::iterator it = hash.find(target - arr[i]);
        if(it != hash.end()) {
            for(int j = 0; j < hash[target-arr[i]].size(); j ++) {
                for(int k = 0; k < hash[arr[i]].size(); k ++) {
                    // 去除 3 + 3 = 6,使用两次同一个3
                    if(target - arr[i] == arr[i] && k <= j) {
                        continue;
                    }
                    int x = min(hash[target-arr[i]][j], hash[arr[i]][k]);
                    int y = max(hash[target-arr[i]][j], hash[arr[i]][k]);
                    results.push_back(make_pair(x, y));
                }
            }
            hash.erase(it);
        }
    }
    return results;
}

2. 查找旋转数组

题目: 排序数组(没有重复元素)根据未知旋转轴排序(例如,0 1 2 3 4 5 变成 3 4 5 0 1 2。给定一个目标值进行搜索,如果存在返回下标,不存在返回-1。
公司: 百度,头条等

int find(vector<int> &arr, int l, int r, int target) {
    if(l > r || arr.size() == 0) return -1;
    int index = -1;
    while(l <= r) {
        int mid = (l + r) / 2;
        if(arr[mid] == target) {
            index = mid;
            break;
        }
        else if(arr[mid] < target) {
            if(arr[r] >= target) l = mid + 1;
            else r = mid - 1;
        }
        else { // arr[mid] > target
            if(arr[l] <= target) right = mid - 1;
            else left = mid + 1;
        }
    }
    return index;
}

3 主元素

题目: 给你一个证书数组,其中有一个数字出现了超过1/2,这个数就是主元素,请找出这个数字。
扩展1: 找到一个主元素,它出现的次数严格大于数组个数的1/3.
公司: 百度,京东

// 每次去掉两个数,剩下的那个就是主元素
int MainElem(int *arr, int n) {
    int mainelem = arr[0];
    int cnt = 1;
    for(int i = 1; i < n; i ++) {
        if(mainelem == arr[i]) {
            cnt ++;
        }
        else {
            cnt --;
            if(cnt == 0) {
                mainelem = arr[i];
                cnt = 1;
            }
        }
    }
    return mainelem;
}

// 每次去掉三个数,选择两个候选集合
int MainElemP(int *arr, int n) {
    int maina, mainb, cnta, cntb;
    cnta = cntb = 1;
    maina = arr[0];
    mainb = arr[1];
    for(int i = 2; i < n; i ++) {
        if(arr[i] == maina) cnta ++;
        else if(arr[i] == mainb) cntb ++;
        else if(cnta == 0) {
            maina = arr[i];
            cnta = 1;
        }
        else if(cntb == 0) {
            mainb = arr[i];
            cntb = 1;
        }
        else { // 去掉三个数
            cnta --;
            cntb --;
        }
    }
    int cnt = 0;
    for(int i = 0; i < n; i ++) {
        if(minas == arr[i]) cnt ++;
    }
    if(cnt >= n / 3) return maina;
    else return mainb;
}

4. 落单的数

题目: 2n+1个数,其中只有一个数出现了一次,其他都出现了两次,求出这个出现一次的数。
扩展1: 2n+2个数,其中有两个出现一次,其他出现两次,求这两个出现一次的数。
扩展2: 3n+1个非负数,只有一个数出现了一次,其他都出现了三次,求出现一次的数。 公司: 常见的题目

// xor: a ^ 0 = a, a ^ a = 0
int SingleNumber(int *arr, int n) {
	int ans = 0;
	for(int i = 0; i  < n; i ++) {
		ans = ans ^ arr[i]
	}
	return ans;
}
// 找到a和b, 和上一个类似,
pair<int, int> SingleNumberP(int *arr, int n) {
    int c = 0;
    for(int i = 0; i  < n; i ++) {
        c = c ^ arr[i]
    }
    // c = a ^ b, 确定c的位数是1的位置。
    int k = 0;
    while(c) {
        if(c & 1) break;
        k ++;
        c =>> 1;
    }
    // 根据1的位置不同确定a和b
    int a = 0, b = 0;
    for(int i = 0; i < n; i ++) {
        if((arr[i]>>k) & 1) {
            a ^= arr[i];
        }
        else {
            b ^= arr[i];
        }
    }
    return make_pair(a, b);
}
// 非负整数,记录所有位的1的个数,对3取余即可
int SingleNumberPP(int *arr, int n) {
    int res = 0;	
    for(int j = 0; j < 32; j ++) {
        int bits = 0;
        for(int i = 0; i < n; i ++) {
            bits += (arr[i] >> j) & 1;
        }
        ans |= (bits % 3) << j;
    }
    return ans;
}

5. 中位数

题目: 给定两个有序数组,找到这两个数组合并排序后的中位数。
公司: 360,阿里

double findMedianSortedArrays(vector<int> &A, vector<int> &B) {
    // do A.size() < B.size()
    if(A.size() > B.size()) swap(A, B);
    int lena = A.size();
    int lenb = B.size();
    int la = 0, ra = lena, ma, mb, madian;
    while(la <= ra) {
        ma = (la + ra) / 2;
        mb = (lena + lenb + 1) / 2 - ma;
        if(ma < lena && mb > 0 && B[mb-1] > A[ma]) {
            la = ma + 1;
        }
        else if(ma > 0 && mb < lenb && B[mb] < A[ma-1]) {
            ra = ma - 1;
        }
        else {
            if(ma == 0) median = B[mb - 1];
            else if(mb == 0) median = A[ma - 1];
            else {
                median = max(A[ma - 1], B[mb - 1]);
            }
            break;
        }
    }
    if((lena + lenb) % 2 == 1) {
        return double(median);
    } 
    if(ma == lena) {
        return (median + B[mb]) / 2.0;
    }
    if(mb == lenb) {
        return (median + A[ma]) / 2.0;
    }
    return (median + min(A[ma], B[mb])) / 2.0;
}

6. 二维数组中的查找

题目: 给你一个每一行每一列都有序的二维数组,给定一个target,查找这个值是否在二维数组中。
扩展1: 计算target出现的次数。
公司: 常见的题目

// 查找是否存在
bool SearchMatrix(vector<vector<int> > matrix, int target) {
    if(matrix.size() == 0) return false;
    int m = matrix.size(), n = matrix[0].size();
    int mid, low = 0, high = n * m - 1;
    while(low <= high) {
        mid = (low + high) / 2;
        int r = mid / n;
        int c = mid % n;
        if(matrix[r][c] == target) {
            return true;
        }
        else if(matrix[r][c] < target) {
            low = mid + 1;
        } 
        else {
            high = mid - 1;
        }
    }
    return false;
}

// 查找次数
int SearchMatrixP(vector<vector<int> > matrix, int target) {
    if(matrix.size() == 0) return 0;
    int m = matrix.size(), n = matrix[0].size();
    int i = m - 1, j = 0, cnt = 0;
    while(i >= 0 && j < n) {
        if(target == matrix[i][j]) {
            cnt ++;
            j ++;
        }
        else if(target > matrix[i][j]) {
            j ++;
        }
        else {
            i --;
        }
    }
    return cnt;
}

7. 构建乘积数组

题目: 给定一个数组A0, 1, …, n-1, 其中B中的元素Bix…xAi-1x…xA[n-1]。
公司: 某创业公司

// 从计算中可以直接使用数组的前缀和后缀乘积
vector<int> multiply(const vector<int>& arr1) {
    vector<int> arr2(arr1.size(), 0);
    // 计算前缀
    arr2[0] = 1;
    for(int i = 1; i < arr1.size(); i ++) {
        arr2[i] = arr2[i - 1] * arr1[i];
    }
    // 计算后缀
    int temp = 1;
    for(int i = arr1.size() - 2; i>= 0; i --) {
        temp *= arr1[i+1];
        arr2[i] *= temp;
    }
    return arr2;
}

8. 滑动窗口的最大值

题目: 给定一个数组array和滑动的大小k,求所有滑动窗口里的最大值。
公司: 头条

// 滑动窗口最大值
vector<int> MaxSildingWindow(vector<int> nums, int k) {
    deque<int> q;
    vector<int> ans;
    if(k <= 0) return ans;
    if(k == 1) return nums;

    for(int i = 0; i < k; i ++) {
        while(!q.empty() && nums[q.back()] <= nums[i]) {
            q.pop_back();
        }
        q.push_back(i);
    }
    for(int i = k; i < nums.size(); i ++) {
        ans.push_back(nums[q.front()]);
        while(!q.empty() && nums[q.back()] <= nums[i]) {
            q.pop_back();
        }
        if(!q.empty() && i - q.front >= k) { // 超过窗口大小
            q.pop_front();
        }
        q.push_back(i);
    }
    // 处理结尾
    ans.push_back(nums[q.front()]);
    return ans;
}

9. 第k小(大)的数

题目: 给你一个无序数组,找出第k小的数。
公司: 常见题目

int randPartition(int *arr,int l,int r){
    int x = arr[l];
    int i=l+1,j=r;
    while(i<j){
        while(arr[i]<x && i<r) i++;
        while(arr[j]>=x && j>l) j--;
        if(i<j){
            swap(arr[i],arr[j]);
            i++;
            j--;
        }
    }
    // 交换最后一个位置
    swap(arr[l],arr[j]);
    return j;
}
int kthSmallest(int *arr,int l,int r,int k){
    if(k<0 || k > r-l+1) return -1;
    int pos = randPartition(arr,l,r);
    // 使用相对位置
    if(pos-l+1 == k) return arr[pos];
    else if(pos-l+1 > k) return kthSmallest(arr,l,pos-1,k);
    else{//在右边,因为使用的是相对位置,所以k要减去左边丢弃的数的个数
        return kthSmallest(arr,pos+1,r,k-(pos-l+1));
    }
}
int findKElem(int *arr, int n, int k) {
    // 根据快速排序的思想,使用快排的一次划分
    if(n < 0 || arr == NULL) return -1;
    return kthSmallest(arr, 0, n-1, k);
}

10. 奇偶排序

题目: 给你一个数组,将所有的偶数排列奇数的前面。
公司: 搜狐

void oddEvenSort(vector<int> &arr) {
    int i = 0, j = arr.size() - 1;
    while(1) {
        while(i < j && a[i] % 2 == 0) i ++;
        while(i < j && a[j] % 2 == 1) j --;
        if(i > j) break;
        swap(arr[i], arr[j]);
        i ++, j --;
    }
}
codingbat:Java语言CodingBat习题解答 编码蝙蝠 使用 Java 语言进行 CodingBat 练习的解决方案。 该项目是使用 Maven 和 TestNG 中的原型创建的,用于单元测试。 立即下载

相关推荐

CodingBatAnswers:这是我所有的CodingBat实践

编码答案 这是我所有的CodingBat练习。

codingbat:recursion-2:1(JAVA)

 public boolean groupSum(int start, int[] nums, int target) {   if(start>=nums.length&&target!=0)      return false;   if(target==0)      return true;   else      return groupSum(start+1,nums

zafzap1的专栏 945

CodingBat-JAVA:JAVA中CodingBat的解决方案

JAVA编码 JAVA中CodingBat的解决方案。 进行中 热身1 逻辑1 作者 陈杰 执照 版权所有:copyright:2015。 根据MIT许可获得许可。

Java课后习题(附带题目和解答)

Java教材课后题

A626796235的博客 8129

OCR开发实战:如何用PaddleOCR C++版实现本地文字识别(附模型文件处理技巧)

本文详细介绍了如何使用PaddleOCR C++版实现本地文字识别,包括环境搭建、工程编译、运行时优化等全流程。重点讲解了在VS2019/VS2022环境下配置PaddleOCR的CPU推理性能优化技巧,以及模型文件处理的实际应用方法,帮助开发者高效完成OCR本地化部署。

devops8pract的博客 335

【Unity报错】Unity导入海康SDK 报错 DllNotFoundException: PlayCtrl assembly

2.尝试按网上其他的办法(包括使用depengs查看dll依赖等)1.先检查Plugins文件夹中是否存在PlayCtrl文件。3.如果网上查阅的办法都不能解决,请继续往下看。更换低版本的SDK库文件。

weixin_42968584的博客 1126

2019最全BAT资深Java面试题答案合集,建议收藏~

马上进入求职招聘高峰,总结了一份BAT(阿里、百度等)资深Java相关的面试题答案合集给到大家。 该板块的各面试章节,后续会持续迭代更新最新一线互联网公司的面试题目,建议收藏该页面,不定期更新查看~ Java虚拟机(JVM) JVM内存模型结构 方法区和直接内存什么时候会oom? JVM收集器G1的内存模型和CMS的内存模型有什么不同? jvm调优用过吗? 如何查看java内存使用情况(jconsole、命令jmap、jstack等等) ...

一个有情怀的程序猿博客 1488

从零解析:富斯i6遥控器与STM32的IBUS协议通信实战

本文详细解析了富斯i6遥控器与STM32通过IBUS协议通信的实战指南,涵盖硬件准备、协议解析、驱动实现及常见问题解决。特别适合机器人及智能小车开发者,提供低成本、高可靠性的无线控制方案,助力快速实现多通道控制功能。

weixin_29193359的博客 440

2019年JAVA最常见面试题汇总

java基础以及多个“比较”1.Collections.sort排序内部原理在Java 6中Arrays.sort()和Collections.sort()使用的是MergeSort,而在Java 7中,内部实现换成了TimSort,其对对象间比较的实现要求更加严格2.hashMap原理,java8做的改变从结构实现来讲,HashMap是数组+链表+红黑树(JDK1.8增加了红黑树部分)实现的。H...

weixin_34128411的博客 255

three.js开发3D地图记录(二)

添加地图点击事件,点击区域,地图区域改变颜色并浮起来。

anwebDesigner的博客 1694

数学建模更新10(蒙特卡罗模拟)

蒙特卡罗模拟一.目录二.引例1:布丰投针实验1.投针步骤2.思路3. 历史实验者二.蒙特卡罗模拟概述1.定义2.提出3.原理4.讨论三.应用实例1.三门问题【1】问题【2】代码2.模拟排队问题【1】题目【2】引入参数【3】总结题目信息【4】过程可视化【5】一些推导公式【6】代码3.有约束的非线性规划问题【1】问题的分类【2】例子【3】推导过程【4】代码 一.目录 二.引例1:布丰投针实验 1.投针步骤 步骤: 1:取一张白纸,在上面画出许多条间距为a的平行线 2:去一根长度为l的针,随机的向纸张上投掷n次

沉晨尘宸的博客 3042

freeCodeCamp 每日编码挑战(Daily Coding Challenge)解析:Challenge 212 Array Insertion 的数组插入实现

本篇技术指南以 freeCodeCamp 开源仓库课程体系中的 [Challenge 212: Array Insertion](https://link.gitcode.com/i/edfbcff70b0f1e1d68238ca147fed92b) 挑战文档为核心,完整解析这道 JavaScript 数组插入题的问题定义、4 组验收断言、官方解法及其底层原理,并结合仓库源码(板块配置、seed

gitblog_00189的博客 211

数学建模--十大经典常用算法

数学建模十大算法:灰色预测,蒙特卡洛,遗传算法,模拟退火法,组合算法,神经网络,动态规划,聚类算法,类比法,概率算法,Floyd算法

qq_51533426的博客 5647

MCP 2026-07-28 规范深度解读:无状态传输层、扩展框架与弃用策略(mcp-for-beginners)

MCP(Model Context Protocol)`2026-07-28` 版本是该协议自发布以来最大的一次修订:六个 Specification Enhancement Proposals(SEP)将协议核心改为无状态、让扩展成为一等公民,并在一套新的功能生命周期政策下正式弃用 Roots、Sampling 与 Logging。本文以 mcp-for-beginners 课程中的 [01-C

gitblog_00525的博客 387

AutoJs调用DeepSeek大模型接口实战教程 AutoJs接入DeepSeek、 DeepSeek API调用 、 手机脚本接入大模型

通过这篇文章,我们用 AutoJs 成功接入了 DeepSeek Chat API。使用发送请求在 Header 里正确携带 API Key从里拿到最终返回结果这样一来,你就可以在 AutoJs 里实现一个智能助手脚本,甚至做更复杂的 AI 自动化工具。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 468

【目标检测】IoU(交并比)详解及代码实现

1. IOU概述        IoU的全称为交并比(Intersection over Union),是目标检测中使用的一个概念,IoU计算的是“预测的边框”和“真实的边框”的交叠率-,即它们的交集和并集的比值。最理想情况是完全重叠,即比值为1。 2. IoU计算        IoU等于“预测的边框”和“真实的边框”之间交集和并集的比值。IoU计算如下图,B1为真实

Roaddd的博客 2万+

leetcode Remove Duplicates from Sorted Array 数组去重

Given a sorted arraynums, remove the duplicatesin-placesuch that each element appear onlyonceand return the new length. Do not allocate extra space for another array, you must do this bymodifyi...

u010785091的博客 181

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

freeCodeCamp 每日编程挑战深度解析:Challenge 211 Array Sum 与 daily-coding-challenge 模块实战

本篇技术指南以 freeCodeCamp 开源课程中 [Challenge 211: Array Sum](https://link.gitcode.com/i/d0e6343d3acbc8366fc657247ea6836d) 为切入点,逐字解读题目要求、五组判定测试与官方参考实现,并向上追溯该挑战在 `daily-coding-challenges-javascript` 模块中从课程 Mar

gitblog_00221的博客 383

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

js中数组Array的一些常用方法总结

var list = new Array()是我们在js中常常写到的代码,今天就总结哈Array的对象具有哪些方法。list[0] = 0;list[1] = 1;list[2] = 2;或者这样声明:var list = [0,1,2]1 shift()t:删除数组的第一个元素,返回删除的值。这里是02 unshift(3,4):把参数加载数组的前面,返回数组的长度。现在l...

weixin_30830327的博客 60

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

我的Java课程学习4——遍历和复制数组

学习使用Java中Arrays类方法操作数组 代码: import java.util.Arrays; public class T2{ public static void main(String args[]){ int[]a={1,2,3,4,500,600,700,800}; int[]b,c,d; System.out.pri

XY_H的博客 706

Python中数组及矩阵的大小

Python中数组及矩阵的大小 写在前面:最近看了caffe以及rcnn-depth的代码,感慨什么时候自己才能写出这样的代码。但是只感慨是没有用的,还是动手码才行!显而易见的是,像我目前这种敲两行代码都要问google是肯定不行,因此往后的一段时间会利用空余时间对目前接触比较多的Python, Matlab及C++中一些容易混淆的问题稍作总结,以期能够慢慢提高的码代码水平。 在上篇博文中介

鲸鱼 6万+

array_pop.php

http://www.w3.org/TR/html4/loose.dtd">     array_pop.php             $stack = array("orange", "banana", "apple", "raspberry"); print_r($stack); echo ''; //获取最后一个元素 $fruit = arra

autumn20080101的专栏 339

将多重嵌套数组恢复为一个数组

问题:给定一个任意多重嵌套数组,把它恢复为一个完整的数组,没有嵌套。 样例: Input steamrollArray([[["a"]], [["b"]]]) steamrollArray([1, [2], [3, [[4]]]]) Output ["a", "b"] [1, 2, 3, 4] 实现:利用dfs搜索,一步步找是否是数组(Array.isArray(a...

weixin_30486037的博客 449

关于js中array的方法

初学array时,只知道他有两个方法 —— push(),pop()。array.push( element)是讲element插入array的最后一位,其index值是最大的。则pop( )则是将array中的最后一位给删除了,并返回相应的值。     直到一次项目需要将输入的item显示在数组的上方,我觉得使用数组倒序排列增加了操作步骤,于是同事跟了我一个很好的建议。使用unshift(

dandelion_c的博客 390

js数组长度

js数组长度 &lt;script&gt; var a = ["js", "java", "c", "c++", "php", "python"]; var b = a.length; document.write(b); &lt;/script&gt; 输出结果是:6

qq_42331499的博客 5403

JavaScript中清空数组的三种方式

http://www.cnblogs.com/snandy/archive/2011/04/04/2005156.html 方式1,splice ? 1 2 3 var ary = [1,2,3,4]; ary.splice(0,ary.length); console.log(ary); // 输出 [],空数组,即被清空了

bytxl的专栏 729
上一篇: 条件随机场CRF
下一篇: Coding-排序(sort)
Datawhale
Datawhale 领域专家: 物联网技术领域 领域专家: 物联网技术领域
博客等级 码龄8年 8901粉丝 1079原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值