文章目录
- 构建乘积数组
- 题目
- 思路
- 代码实现
- 第一个只出现一次的字符
- 题目
- 思路
- 代码实现
- 替换空格
- 题目
- 思路
- 代码实现
- 调整数组顺序使奇数位于偶数前面(一)
- 题目
- 思路
- 代码实现
- 数组中出现次数超过一半的数字
- 题目
- 思路
- 代码实现
- 整数中1出现的次数(从1到n整数中1出现的次数)
- 题目
- 思路
- 代码实现
构建乘积数组
题目
描述
给定一个数组 A[0,1,…,n-1] ,请构建一个数组 B[0,1,…,n-1] ,其中 B 的元素 B[i]=A[0]A[1]…*A[i-1]A[i+1]…*A[n-1](除 A[i] 以外的全部元素的的乘积)。程序中不能使用除法。(注意:规定 B[0] = A[1] * A[2] * … * A[n-1],B[n-1] = A[0] * A[1] * … * A[n-2])
对于 A 长度为 1 的情况,B 无意义,故而无法构建,用例中不包括这种情况。
数据范围:1≤n≤10 ,数组中元素满足 ∣val∣≤10
示例1
输入:
[1,2,3,4,5]
返回值:
[120,60,40,30,24]
示例2
输入:
[100,50]
返回值:
[50,100]
牛客题目链接
思路
采用双重for循环,外循环i倒序遍历数组,内循环j顺序遍历数组,内循环中当i!=j时,乘上当前A[j](除 A[i] 以外的全部元素的的乘积),同时每次内循环遍历一遍后,需要将临时数据重置,结果在外循环中存储;
代码实现
public int[] multiply (int[] A) {if(A == null || A.length < 2){return new int[0];}int[] res = new int[A.length];int sum = 0;for(int i = A.length - 1;i>=0;i--){sum = 1;for(int j = 0; j < A.length;j++){if(i != j){sum *= A[j];}}res[i] = sum;}return res;}
第一个只出现一次的字符
题目
描述
在一个长为 字符串中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).(从0开始计数)
数据范围:0≤n≤10000,且字符串只有字母组成。
要求:空间复杂度 O(n),时间复杂度 O(n)
示例1
输入:
“google”
返回值:
4
示例2
输入:
“aa”
返回值:
-1
牛客题目链接
思路
采用HashMap + 两次for循环处理,第一次for循环记录每个字符出现的次数,第二次for循环找出第一个出现一次的字符。
代码实现
public int FirstNotRepeatingChar (String str) {if(str == null){return -1;}HashMap<Character,Integer> hash = new HashMap();for(int i = 0; i<str.length();i++){char a = str.charAt(i);if(hash.containsKey(a)){hash.put(a,2);//没必要统计字符出现的次数,不要设置不为1即可。}else{hash.put(a,1);}}for(int i = 0; i < str.length();i++){char a = str.charAt(i);if(hash.get(a) == 1){return i;}}return -1;}
替换空格
题目
描述
请实现一个函数,将一个字符串s中的每个空格替换成“%20”。
例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
数据范围:0≤len(s)≤1000 。保证字符串中的字符为大写英文字母、小写英文字母和空格中的一种。
示例1
输入:
“We Are Happy”
返回值:
“We%20Are%20Happy”
示例2
输入:
" "
返回值:
“%20”
牛客题目链接
思路
直接for循环判断拼接;
代码实现
public String replaceSpace (String s) {if(s == null || s.length() == 0){return s;}StringBuilder res = new StringBuilder();for(int i = 0; i < s.length();i++){char c = s.charAt(i);if(' ' == c){res.append("%20");}else{res.append(c);}}return res.toString();}
调整数组顺序使奇数位于偶数前面(一)
题目
描述
输入一个长度为 n 整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前面部分,所有的偶数位于数组的后面部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
数据范围:0≤n≤5000,数组中每个数的值 0≤val≤10000
要求:时间复杂度 O(n),空间复杂度 O(n)
进阶:时间复杂度 O(n/2),空间复杂度 O(1)
示例1
输入:
[1,2,3,4]
返回值:
[1,3,2,4]
示例2
输入:
[2,4,6,5,7]
返回值:
[5,7,2,4,6]
牛客链接地址
思路
采用双指针思路,一个指针用于记录奇数从前往后遍历,则结果数组前部分记录的都是奇数,一个指针用于记录偶数从后往前遍历,则结果数组后部分记录的都是偶数,直到都遍历完整个数组为止;
代码实现
public int[] reOrderArray(int[] array) {if (array == null || array.length == 0) {return array;}int[] res = new int[array.length];int l = 0;int li = l;int r = array.length - 1;int ri = r;while (l < array.length && r >= 0) {if (array[l] % 2 == 1) {//当前是奇数res[li++] = array[l];}l++;if (array[r] % 2 == 0) {//当前是偶数res[ri--] = array[r];}r--;}return res;}
数组中出现次数超过一半的数字
题目
描述
给一个长度为 n 的数组,数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
例如输入一个长度为9的数组[1,2,3,2,2,2,5,4,2]。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。
数据范围:n≤50000,数组中元素的值 0≤val≤10000
要求:空间复杂度:O(1),时间复杂度 O(n)
输入描述:
保证数组输入非空,且保证有解
示例1
输入:
[1,2,3,2,2,2,5,4,2]
返回值:
2
示例2
输入:
[3,3,3,3,2,2,2]
返回值:
牛客题目链接
思路
使用哈希表统计数组中数字出现的次数,然后判断即可;
代码实现
public int MoreThanHalfNum_Solution (int[] numbers) {HashMap<Integer,Integer> hash = new HashMap();for(int num : numbers){if(hash.containsKey(num)){hash.put(num,hash.get(num)+1);} else{hash.put(num,1);}if(hash.get(num) > numbers.length /2){return num;}}return numbers[0];}
整数中1出现的次数(从1到n整数中1出现的次数)
题目
描述
输入一个整数 n ,求 1~n 这 n 个整数的十进制表示中 1 出现的次数
例如, 1~13 中包含 1 的数字有 1 、 10 、 11 、 12 、 13 因此共出现 6 次
注意:11 这种情况算两次
数据范围: 1≤n≤30000
进阶:空间复杂度 O(1) ,时间复杂度 O(lognn)
示例1
输入:
13
返回值:
6
示例2
输入:
0
返回值:
0
思路
直接遍历每一个数字的每一位是否为1进行累加;
代码实现
public int NumberOf1Between1AndN_Solution(int n) {int res = 0;for(int i = 1; i <= n;i++){for(int j = i;j>0;j=j/10){if(j % 10 == 1){res++;}}}return res;}