package homework;
import java.util.Scanner;
public class Work21list {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("你想插入数还是删除数,1 or 0");
int c=sc.nextInt();
System.out.println("什么数");
int n=sc.nextInt();
if(c==1) {
System.out.println(insert(find(n)));
}
else if(c==0)
System.out.println(delete((find(n))));
else
System.out.println("请输入0或1");
}
public static int insert(int n) {
if(n>=0) {//不存在
return n;
}else {//存在
return -1;
}
}
public static int delete(int n) {
int d=-n;
int[] arr=bub();
if(d>0) {//存在
int[] list=new int[arr.length-1] ;
for(int j=0;j<arr.length-1;j++) {
if(j<d) {
list[j]=arr[j];
}else
list[j]=arr[j+1];
}
return d+1;
}else //不存在
return -1;
}
public static int[] bub() {
int[] arr=new int[] {34,76,23, 67, 345, 234, 21, 78, 172, 90};
for(int j=0;j<arr.length-1;j++) {
for(int n=0;n<arr.length-1-j;n++) {
if(arr[n]>arr[n+1]) {
int s=arr[n+1];
arr[n+1]=arr[n];
arr[n]=s;
}
}
}
return arr;
}
public static int find(int target) {
int[] arr=bub();
int left=0;
int right=arr.length-1;
while(left<=right) {
int mid=(left+right)/2;
if(arr[mid]>target) {
right=mid-1;
}if(arr[mid]<target) {
left=mid+1;
}if(arr[mid]==target) {
return -mid-1;
}//是否存在该元素
}
//如果不存在
if(target<arr[0])
return 0;
if(target>arr[arr.length-1])
return arr.length;
while(right-1!=left) {
int mid=(left+right)/2;
if(arr[mid]>target) {
right=mid+1;
}if(arr[mid]<target) {
left=mid-1;
}
}
return right;
}
}
bub()返回的数据是有序的么?
调试下。
原数组为21,23.....但我输入22会返回0,不知道为什么
**
我能够给出以下解决方案:
public static int binaryInsert(int[] arr, int num) {
int left = 0;
int right = arr.length - 1;
int mid;
while (left <= right) {
mid = (left + right) / 2;
if (arr[mid] < num) {
left = mid + 1;
} else if (arr[mid] > num) {
right = mid - 1;
} else {
return mid; // 如果存在对应的数,返回该数的下标
}
}
// 如果不存在对应的数,返回插入该数后的下标
int insertIndex = left;
for (int i = arr.length - 1; i >= left; i--) {
arr[i] = arr[i - 1];
}
arr[insertIndex] = num;
return insertIndex;
}
该方法可以接收一个已经排好序的整型数组和一个新的整数,通过二分法查找该整数在数组中的位置并实现插入操作。
public static int binaryDelete(int[] arr, int num) {
int left = 0;
int right = arr.length - 1;
int mid;
while (left <= right) {
mid = (left + right) / 2;
if (arr[mid] < num) {
left = mid + 1;
} else if (arr[mid] > num) {
right = mid - 1;
} else {
for (int i = mid; i < arr.length - 1; i++) {
arr[i] = arr[i + 1];
}
arr[arr.length - 1] = 0; // 数组长度减1,并将最后一位赋值为0
return mid;
}
}
return -1; // 如果未找到要删除的元素,则返回-1
}
该方法可以接收一个已经排好序的整型数组和一个要删除的整数,通过二分法查找该整数在数组中的位置并从数组中删除。
Java中可以使用Arrays类提供的sort方法进行排序。具体代码如下所示:
Arrays.sort(arr); // 排序
Java中可以使用哈希表(HashMap)来求两个数组的交集和并集。具体代码如下所示:
public static void intersection(int[] arr1, int[] arr2) {
HashMap<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < arr1.length; i++) {
map.put(arr1[i], i);
}
for (int j = 0; j < arr2.length; j++) {
if (map.containsKey(arr2[j])) {
System.out.println(arr2[j]);
}
}
}
public static void union(int[] arr1, int[] arr2) {
HashMap<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < arr1.length; i++) {
map.put(arr1[i], i);
System.out.print(arr1[i] + " ");
}
for (int j = 0; j < arr2.length; j++) {
if (!map.containsKey(arr2[j])) {
System.out.print(arr2[j] + " ");
}
}
}
可以使用异或运算符来实现。具体代码如下所示:
public static int singleNum(int[] arr) {
int sum = 0;
for (int i = 0; i < arr.length; i++) {
sum=sum^arr[i];
}
return sum;
}
public static void main(String args[]){
int[] arr= new int[]{1,2,3,4,5,6,2,3,4,5,6,1,0};
System.out.println(singleNum(arr));
}
其中使用了异或运算符(^),通过将所有元素都异或一遍来找到只出现一次的元素。如果数组中除了某一个元素以外,其他的元素都出现了两次,那么对所有元素进行异或操作的结果就是那个只出现了一次的元素。