LeetCode 27.移除元素

电玩女神 2023-10-09 15:03 163阅读 0赞

LeetCode官网题目地址:力扣

Java实现代码:

  1. package array;
  2. import java.util.ArrayList;
  3. /**
  4. * @ClassName LeetCode 27.移除元素
  5. * @Description https://leetcode.cn/problems/remove-element/
  6. * @Author Jiangnan Cui
  7. * @Date 2022/10/23 19:58
  8. * @Version 1.0
  9. */
  10. public class LeetCode27 {
  11. /**
  12. * @MethodName removeElement
  13. * @Description 方法1:新建一个ArrayList,使用额外的空间来存储元素
  14. * 时间复杂度:O(n),其中,n为数组长度
  15. * 空间复杂度:O(n)
  16. * 但不满足题目要求
  17. * @param: nums 目标数组
  18. * @param: val 移除元素值
  19. * @return: int 返回不等于val的数组元素个数
  20. * @Author Jiangnan Cui
  21. * @Date 23:02 2022/10/24
  22. */
  23. public int removeElement(int[] nums, int val) {
  24. // 用ArrayList来保存满足要求的数组元素
  25. ArrayList<Integer> list = new ArrayList<Integer>();
  26. // 遍历数组
  27. for (int i = 0; i < nums.length; i++) {
  28. // 不等于val时
  29. if(nums[i] != val){
  30. // 存入result
  31. list.add(nums[i]);
  32. }
  33. // 等于val时,不做任何处理
  34. }
  35. // 遍历完成后,list的大小即为不等于val元素值的数组的长度
  36. // 注意:此处只为满足题目要求,即所得结果长度对应的原数组元素满足要求,不然测试时输出结果数组不对,不涉及原数组时不用考虑
  37. // 对原数组对应位置元素进行替换
  38. for (int i = 0; i < list.size(); i++) {
  39. nums[i] = list.get(i);
  40. }
  41. // 返回有效元素长度
  42. return list.size();
  43. }
  44. /**
  45. * @MethodName removeElement2
  46. * @Description 方法2:原地移除元素,通过复制元素实现
  47. * 时间复杂度:O(n),其中,n为数组长度
  48. * 空间复杂度:O(1),其中,需要常数个变量空间
  49. * 满足题目要求
  50. * @param: nums 目标数组
  51. * @param: val 移除元素值
  52. * @return: int 返回不等于val的数组元素个数
  53. * @Author Jiangnan Cui
  54. * @Date 23:02 2022/10/24
  55. */
  56. public int removeElement2(int[] nums, int val) {
  57. // 用作记录不等于val时的下标索引
  58. int index = 0;
  59. // 遍历数组
  60. for (int i = 0; i < nums.length; i++) {
  61. // 不等于val时
  62. if(nums[i] != val){
  63. // 放入数组指定的index位置,同时index加1右移
  64. nums[index++] = nums[i];
  65. }
  66. // 等于val时,不做任何处理
  67. }
  68. // 遍历完成后,index的大小即为不等于val元素值的数组的长度
  69. return index;
  70. }
  71. /**
  72. * @MethodName removeElement3
  73. * @Description 方法3:对方法2进行优化,避免两个元素相同时的重复赋值操作
  74. * 时间复杂度:O(n),其中,n为数组长度
  75. * 空间复杂度:O(1),其中,需要常数个变量空间
  76. * 满足题目要求
  77. * @param: nums 目标数组
  78. * @param: val 移除元素值
  79. * @return: int 返回不等于val的数组元素个数
  80. * @Author Jiangnan Cui
  81. * @Date 23:02 2022/10/24
  82. */
  83. public int removeElement3(int[] nums, int val) {
  84. // 用作记录不等于val时的下标索引
  85. int index = 0;
  86. // 遍历数组
  87. for (int i = 0; i < nums.length; i++) {
  88. // 不等于val时
  89. if(nums[i] != val){
  90. // 判断两个位置是否相同,相同时不做处理,但index要加1,向右移动
  91. if(i == index){
  92. index++;
  93. }else{// 两个位置不相同时。放入数组指定的index位置,同时index加1右移
  94. nums[index++] = nums[i];
  95. }
  96. }
  97. // 等于val时,不做任何处理
  98. }
  99. // 遍历完成后,index的大小即为不等于val元素值的数组的长度
  100. return index;
  101. }
  102. /**
  103. * @MethodName removeElement4
  104. * @Description 方法4:双指针法,通过while循环实现
  105. * 时间复杂度:O(n),其中,n为数组长度
  106. * 空间复杂度:O(1),其中,需要常数个变量空间
  107. * 满足题目要求
  108. * @param: nums 目标数组
  109. * @param: val 移除元素值
  110. * @return: int 返回不等于val的数组元素个数
  111. * @Author Jiangnan Cui
  112. * @Date 23:02 2022/10/24
  113. */
  114. public int removeElement4(int[] nums, int val) {
  115. // 用作记录不等于val时的下标索引
  116. int i = 0;
  117. // 用来指定边界
  118. int right = nums.length;
  119. // 循环条件
  120. while(i < right){
  121. // 当数组中元素值等于待移除元素值时
  122. if(nums[i] == val){
  123. // 将右侧元素放到要移除元素的位置上进行元素替换
  124. nums[i] = nums[right - 1];
  125. // 此时右侧的元素已经替换掉左侧待移除的元素了,right指针左移,改变right指针位置
  126. right--;
  127. // 接下来判断交换的元素是否满足条件,即回到while循环条件判断处
  128. }else{
  129. // 不相等时,i加1右移,right不变
  130. i++;
  131. }
  132. }
  133. // 当i==right时,退出循环,此时i的大小即为不等于val时元素的个数
  134. return i;
  135. }
  136. /**
  137. * @MethodName removeElement5
  138. * @Description 方法5:对方法4进行进行优化,相同元素时不交换
  139. * 时间复杂度:O(n),其中,n为数组长度
  140. * 空间复杂度:O(1),其中,需要常数个变量空间
  141. * 满足题目要求
  142. * @param: nums 目标数组
  143. * @param: val 移除元素值
  144. * @return: int 返回不等于val的数组元素个数
  145. * @Author Jiangnan Cui
  146. * @Date 23:02 2022/10/24
  147. */
  148. public int removeElement5(int[] nums, int val) {
  149. // 用作记录不等于val时的下标索引
  150. int i = 0;
  151. // 用来指定边界
  152. int right = nums.length;
  153. // 循环条件
  154. while(i < right){
  155. // 当数组中元素值等于待移除元素值时
  156. if(nums[i] == val){
  157. // 将右侧元素放到要移除元素的位置上进行元素替换
  158. // 先判断右侧元素是否与当前元素相等,不相等时才交换元素,同时right减1左移
  159. if(nums[i] != nums[right - 1]){
  160. nums[i] = nums[right - 1];
  161. }
  162. // 相等时,不必交换,只需要right减1左移即可
  163. right--;
  164. // 此时右侧的元素已经替换掉左侧待移除的元素了,接下来判断交换的元素是否满足条件,即回到while循环条件判断处
  165. }else{
  166. // 不相等时,i加1右移,right不变
  167. i++;
  168. }
  169. }
  170. // 当i==right时,退出循环,此时i的大小即为不等于val时元素的个数
  171. return i;
  172. }
  173. /**
  174. * @MethodName removeElement6
  175. * @Description 方法6:对方法5的边界条件进行改变,测试使用
  176. * 时间复杂度:O(n),其中,n为数组长度
  177. * 空间复杂度:O(1),其中,需要常数个变量空间
  178. * 满足题目要求
  179. * @param: nums 目标数组
  180. * @param: val 移除元素值
  181. * @return: int 返回不等于val的数组元素个数
  182. * @Author Jiangnan Cui
  183. * @Date 23:02 2022/10/24
  184. */
  185. public int removeElement6(int[] nums, int val) {
  186. // 用作记录不等于val时的下标索引
  187. int i = 0;
  188. // 用来指定边界,此处改为数组最右侧索引下标
  189. int right = nums.length - 1;
  190. // 循环条件
  191. while(i <= right){
  192. // 当数组中元素值等于待移除元素值时
  193. if(nums[i] == val){
  194. // 将右侧元素放到要移除元素的位置上进行元素替换
  195. // 先判断右侧元素是否与当前元素相等,不相等时才交换元素,同时right减1左移
  196. if(nums[i] != nums[right]){
  197. nums[i] = nums[right];
  198. }
  199. // 相等时,不必交换,只需要right减1左移即可
  200. right--;
  201. // 此时右侧的元素已经替换掉左侧待移除的元素了,接下来判断交换的元素是否满足条件,即回到while循环条件判断处
  202. }else{
  203. // 不相等时,i加1右移,right不变
  204. i++;
  205. }
  206. }
  207. // 当i>right时,退出循环,此时i的大小即为不等于val时元素的个数
  208. return i;
  209. }
  210. public static void main(String[] args) {
  211. int[] nums = new int[]{3,2,2,3};
  212. int val = 3;
  213. int i = new LeetCode27().removeElement(nums, val);
  214. System.out.println("i = " + i);
  215. int[] nums2 = new int[]{3,2,2,3};
  216. int val2 = 3;
  217. int i2 = new LeetCode27().removeElement2(nums2, val2);
  218. System.out.println("i2 = " + i2);
  219. int[] nums3 = new int[]{3,2,2,3};
  220. int val3 = 3;
  221. int i3 = new LeetCode27().removeElement3(nums3, val3);
  222. System.out.println("i3 = " + i3);
  223. int[] nums4 = new int[]{3,2,2,3};
  224. int val4 = 3;
  225. int i4 = new LeetCode27().removeElement4(nums4, val4);
  226. System.out.println("i4 = " + i4);
  227. int[] nums5 = new int[]{3,2,2,3};
  228. int val5 = 3;
  229. int i5 = new LeetCode27().removeElement5(nums5, val5);
  230. System.out.println("i5 = " + i5);
  231. int[] nums6 = new int[]{0,1,2,2,3,0,4,2};
  232. int val6 = 2;
  233. int i6 = new LeetCode27().removeElement(nums6, val6);
  234. System.out.println("i6 = " + i6);
  235. int[] nums7 = new int[]{0,1,2,2,3,0,4,2};
  236. int val7 = 2;
  237. int i7 = new LeetCode27().removeElement2(nums7, val7);
  238. System.out.println("i7 = " + i7);
  239. int[] nums8 = new int[]{0,1,2,2,3,0,4,2};
  240. int val8 = 2;
  241. int i8 = new LeetCode27().removeElement3(nums8, val8);
  242. System.out.println("i8 = " + i8);
  243. int[] nums9 = new int[]{0,1,2,2,3,0,4,2};
  244. int val9 = 2;
  245. int i9 = new LeetCode27().removeElement4(nums9, val9);
  246. System.out.println("i9 = " + i9);
  247. int[] nums10 = new int[]{0,1,2,2,3,0,4,2};
  248. int val10 = 2;
  249. int i10 = new LeetCode27().removeElement5(nums10, val10);
  250. System.out.println("i10 = " + i10);
  251. int[] nums101 = new int[]{3,2,2,3};
  252. int val101 = 2;
  253. int i101 = new LeetCode27().removeElement6(nums101, val101);
  254. System.out.println("i101 = " + i101);
  255. int[] nums102 = new int[]{0,1,2,2,3,0,4,2};
  256. int val102 = 2;
  257. int i102 = new LeetCode27().removeElement6(nums102, val102);
  258. System.out.println("i102 = " + i102);
  259. }
  260. }

输出结果:

  1. i = 2
  2. i2 = 2
  3. i3 = 2
  4. i4 = 2
  5. i5 = 2
  6. i6 = 5
  7. i7 = 5
  8. i8 = 5
  9. i9 = 5
  10. i10 = 5
  11. i101 = 2
  12. i102 = 5

发表评论

表情:
评论列表 (有 0 条评论,163人围观)

还没有评论,来说两句吧...

相关阅读

    相关 LeetCode27. 元素

    难度:`简单` 题目描述: > 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 > 不要使用额外

    相关 LeetCode27. 元素

    给定一个数组 nums 和一个值 val,你需要[原地][Link 1]移除所有数值等于 val 的元素,返回移除后数组的新长度。 不要使用额外的数组空间,你必须在[原地][

    相关 leetcode:27.元素

    题目描述: 给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度。 不要使用额外的数组空间,你必须在原地修改输入